validaciones, login y envio de correo

This commit is contained in:
Soka_jplr 2024-06-02 22:59:59 -06:00
parent f50deaf29d
commit 0d581cb07f
36 changed files with 451 additions and 1543 deletions

View File

@ -5,7 +5,7 @@ CREATE USER 'UserRemoto' @'localhost' IDENTIFIED BY 'password123';
GRANT ALL PRIVILEGES ON universidad.* TO 'UserRemoto'@'LOCALHOST';
FLUSH PRIVILEGES;
drop database universidad;
use universidad;
create table usuario(
@ -21,13 +21,18 @@ create table usuario(
curp varchar(18),
rol varchar(30) not null,
idCarrera integer references carrera,
inscrito BIT
inscrito int
);
create table carrera(
id integer auto_increment primary key,
nombre varchar(40),
area varchar(40)
area varchar(40),
campus VARCHAR(40),
descripcion VARCHAR(600),
mision VARCHAR(600),
vision VARCHAR(600),
objetivo VARCHAR(600)
);
create table tutor(
@ -37,20 +42,20 @@ create table tutor(
numeroDeTelefono double,
idUsuario integer references usuario
);
ALTER TABLE usuario
MODIFY COLUMN inscrito int;
create table documento(
id integer auto_increment primary key,
titulo varchar(40),
archivo blob,
archivo longblob,
idUsuario integer references usuario,
valido BIT
);
drop table inscripcion;
create table inscripcion(
id integer auto_increment primary key,
idUusario integer references usuario,
idDocumento integer references documento
idUsuario integer references usuario,
idCarrera integer references carrera
);
create table registro(
@ -64,13 +69,6 @@ INSERT INTO usuario (
'Juan', 'Perez', 'SIU241001', 'password123', 'juan.perez@example.com', 'Mexicana', 'O+', '1990-05-15', 'JUAP900515HDFLRN03', 'estudiante', 1, 1
);
ALTER TABLE carrera
ADD COLUMN campus VARCHAR(40),
ADD COLUMN descripcion VARCHAR(600),
ADD COLUMN mision VARCHAR(600),
ADD COLUMN vision VARCHAR(600),
ADD COLUMN objetivo VARCHAR(600);
INSERT INTO carrera (nombre, area) VALUES
('Ingeniería de Sistemas', 'Tecnología'),
('Medicina', 'Salud'),
@ -127,8 +125,6 @@ SET campus = 'Xalapa',
objetivo = 'Nuestro objetivo es formar psicólogos con una sólida base científica y habilidades prácticas para evaluar, diagnosticar y tratar problemas psicológicos. Fomentamos el pensamiento crítico, la empatía y la ética profesional, preparando a los estudiantes para contribuir al bienestar mental y emocional de las personas y comunidades que atienden.'
WHERE id = 6;
UPDATE `tutor` SET `nombre` = ?, `apellido` = ?, `numeroDeTelefono` = ? WHERE `idUsuario` = ?;

View File

@ -1,4 +1,5 @@
import mysql from 'mysql2/promise'; // Importa la versión de la biblioteca que soporta promesas
import logger from '../utils/logger.js'; // Importa el logger
class Conexion {
constructor() {
@ -14,10 +15,10 @@ class Conexion {
async conectar() {
try {
this.conexion = await mysql.createConnection(this.configuracion);
console.log('Conexión exitosa a MySQL');
logger.info('Conexión exitosa a MySQL');
return this.conexion;
} catch (error) {
console.error('Error al conectar con la base de datos:', error.message);
logger.error(`Error al conectar con la base de datos: ${error.message}`);
return null;
}
}
@ -26,10 +27,10 @@ class Conexion {
if (this.conexion) {
this.conexion.end((err) => {
if (err) {
console.error('Error al cerrar la conexión con la base de datos:', err.message);
logger.error(`Error al cerrar la conexión con la base de datos: ${err.message}`);
return;
}
console.log('Se desconectó de la base de datos');
logger.info('Se desconectó de la base de datos');
});
}
}

View File

@ -2,6 +2,7 @@ import Conexion from './Conexion.js'; // Asegúrate de tener la ruta correcta al
import Usuario from '../Model/Usuario.js'; // Asegúrate de tener la ruta correcta al archivo de Usuario
import Mensaje from '../Model/Mensaje.js'; // Asegúrate de tener la ruta correcta al archivo de Mensaje
import DAORegistro from './DAORegistro.js';
import logger from '../utils/logger.js'; // Importa el logger
class DAO {
@ -9,14 +10,14 @@ class DAO {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `SELECT id, matricula FROM usuario where inscrito = 1`;
const sql = `SELECT U.id, U.matricula FROM usuario U WHERE U.id NOT IN (SELECT I.idUsuario FROM inscripcion I, usuario U WHERE U.id = I.idUsuario) AND U.inscrito = 1;`;
const [rows] = await conexionEstablecida.query(sql);
const resultado = rows.map(row => {
return { id: row.id, matricula: row.matricula };
});
return resultado;
} catch (error) {
console.error(error); s
logger.error(`Error en DAO.matriculas: ${error.message}`);
return [];
} finally {
conexion.cerrarConexion();
@ -31,7 +32,7 @@ class DAO {
const [rows] = await conexionEstablecida.query(sql, [alumno.getMatricula(), alumno.getContrasena()]);
return rows.length > 0;
} catch (error) {
console.error(error);
logger.error(`Error en DAO.validarAlumno: ${error.message}`);
return false;
} finally {
conexion.cerrarConexion();
@ -52,9 +53,14 @@ class DAO {
usuario.nombre, usuario.apellido, usuario.nacionalidad,
usuario.matricula, usuario.contrasena, usuario.correo, usuario.rol
]);
return result.affectedRows > 0 ? new Mensaje(true, usuario.matricula, usuario.contrasena) : new Mensaje(false, null);
if (result.affectedRows > 0) {
await DAORegistro.registrar(usuario, "Alumno agregado", new Date());
return new Mensaje(true, usuario.matricula, usuario.contrasena);
} else {
return new Mensaje(false, null);
}
} catch (error) {
console.error(error);
logger.error(`Error en DAO.agregarAlumno: ${error.message}`);
return new Mensaje(false, null);
} finally {
conexion.cerrarConexion();
@ -71,9 +77,13 @@ class DAO {
usuario.nacionalidad, usuario.tipoSangre, usuario.fecha_nacimiento,
usuario.curp, usuario.idCarrera, usuario.id
]);
return result.affectedRows > 0;
if (result.affectedRows > 0) {
await DAORegistro.registrar(usuario, "Alumno editado", new Date());
return true;
}
return false;
} catch (error) {
console.error(error);
logger.error(`Error en DAO.editarAlumno: ${error.message}`);
return false;
} finally {
conexion.cerrarConexion();
@ -99,7 +109,7 @@ class DAO {
}
return null;
} catch (error) {
console.error(error);
logger.error(`Error en DAO.alumnoIniciado: ${error.message}`);
return null;
} finally {
conexion.cerrarConexion();
@ -114,7 +124,7 @@ class DAO {
const [rows] = await conexionEstablecida.query(sql);
return rows[0].ultimo_id || -1;
} catch (error) {
console.error(error);
logger.error(`Error en DAO.obtenerUltimoID: ${error.message}`);
return -1;
} finally {
conexion.cerrarConexion();
@ -152,24 +162,31 @@ class DAO {
);
}
} catch (error) {
console.error(error);
logger.error(`Error en DAO.traeUsuario: ${error.message}`);
} finally {
conexion.cerrarConexion();
}
return usuario;
}
static async editarAlumnoInscrito(data) {
static async editarAlumnoInscrito(data, id) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `UPDATE usuario SET inscrito = ? WHERE id = ?`;
const [result] = await conexionEstablecida.query(sql, [
1, data.idUsuario
id, data.idUsuario
]);
return result.affectedRows > 0;
if (result.affectedRows > 0) {
const usuario = new Usuario();
usuario.id = data.idUsuario;
await DAORegistro.registrar(usuario, "Alumno inscrito", new Date());
return true;
}
return false;
} catch (error) {
logger.error(`Error en DAO.editarAlumnoInscrito: ${error.message}`);
return false;
} finally {
conexion.cerrarConexion();
}
@ -180,7 +197,7 @@ class DAO {
const conexionEstablecida = await conexion.conectar();
let usuario = null;
try {
const sql = `SELECT U.id,U.nombre,U.apellido,matricula,correo,nacionalidad,tipoSangre,fecha_nacimiento,curp,inscrito, T.nombre as tutorNombre, T.apellido as tutorApellido, T.numeroDeTelefono,C.nombre as carreraNombre FROM usuario U, tutor T, carrera C where C.id= U.idCarrera and U.id = T.idUsuario and inscrito =1 and U.id =?;`;
const sql = `SELECT U.id, U.nombre, U.apellido, matricula, correo, nacionalidad, tipoSangre, fecha_nacimiento, curp, inscrito, T.nombre as tutorNombre, T.apellido as tutorApellido, T.numeroDeTelefono, C.nombre as carreraNombre, C.id as idCarrera FROM usuario U, tutor T, carrera C WHERE C.id = U.idCarrera AND U.id = T.idUsuario AND inscrito = 1 AND U.id = ?;`;
const [rows] = await conexionEstablecida.query(sql, [id]);
if (rows.length > 0) {
const row = rows[0];
@ -203,16 +220,61 @@ class DAO {
tutorNombre: row.tutorNombre,
tutorApellido: row.tutorApellido,
numeroDeTelefono: row.numeroDeTelefono,
carreraNombre: row.carreraNombre
}
carreraNombre: row.carreraNombre,
idCarrera: row.idCarrera
};
}
} catch (error) {
console.error(error);
logger.error(`Error en DAO.traeTodosLosDatosUsuario: ${error.message}`);
} finally {
conexion.cerrarConexion();
}
return usuario;
}
static async inscribirUsuario(data) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `INSERT INTO inscripcion (idUsuario, idCarrera) VALUES (?, ?);`;
const [result] = await conexionEstablecida.query(sql, [data.id, data.idCarrera]);
if (result.affectedRows > 0) {
const usuario = new Usuario();
usuario.id = data.id;
await DAORegistro.registrar(usuario, "Usuario inscrito", new Date());
return true;
}
return false;
} catch (error) {
logger.error(`Error en DAO.inscribirUsuario: ${error.message}`);
return false;
} finally {
conexion.cerrarConexion();
}
}
static async editarAlumnoRechazado(data, id) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `UPDATE usuario SET inscrito = ? WHERE id = ?`;
const [result] = await conexionEstablecida.query(sql, [
id, data.id
]);
if (result.affectedRows > 0) {
const usuario = new Usuario();
usuario.id = data.id;
await DAORegistro.registrar(usuario, "Alumno rechazado", new Date());
return true;
}
return false;
} catch (error) {
logger.error(`Error en DAO.editarAlumnoRechazado: ${error.message}`);
return false;
} finally {
conexion.cerrarConexion();
}
}
}
export default DAO;

View File

@ -1,5 +1,7 @@
import Conexion from './Conexion.js'; // Asegúrate de tener la ruta correcta al archivo de conexión
import Carrera from '../Model/Carrera.js'; // Asegúrate de tener la ruta correcta al archivo de Carrera
import logger from '../utils/logger.js'; // Importa el logger
import DAORegistro from './DAORegistro.js'; // Asegúrate de tener la ruta correcta al archivo de DAORegistro
class DAOCarrera {
static async dameCarreras() {
@ -9,9 +11,11 @@ class DAOCarrera {
const sql = "SELECT * FROM carrera";
const [rows] = await conexionEstablecida.query(sql);
const resultado = rows.map(row => new Carrera(row.id, row.nombre, row.area, row.campus, row.descripcion, row.mision, row.vision, row.objetivo));
await DAORegistro.registrar({ getMatricula: () => 'SYSTEM' }, 'Consultó carreras', new Date().toISOString());
return resultado;
} catch (error) {
console.error(error);
logger.error(`Error al obtener carreras: ${error.message}`);
return [];
} finally {
conexion.cerrarConexion();

View File

@ -1,17 +1,25 @@
import Conexion from './Conexion.js';
import logger from '../utils/logger.js'; // Importa el logger
import DAORegistro from './DAORegistro.js'; // Asegúrate de tener la ruta correcta al archivo de DAORegistro
class DAODocumento {
static async agregarDocumento(req, file) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar()
const conexionEstablecida = await conexion.conectar();
try {
const sql = "INSERT INTO `documento`(`titulo`,`archivo`,`idUsuario`,`valido`) VALUES(?,?,?,?);";
const [result] = await conexionEstablecida.query(sql, [
req.titulo, file, req.idUsuario, 0
]);
if (result.affectedRows > 0) {
// Registrar la operación
await DAORegistro.registrar({ getMatricula: () => req.idUsuario }, 'Agregó documento', new Date().toISOString());
}
return result.affectedRows > 0;
} catch (error) {
console.log(error);
logger.error(`Error al agregar documento: ${error.message}`);
throw error;
} finally {
conexion.cerrarConexion();

View File

@ -1,4 +1,5 @@
import Conexion from './Conexion.js'; // Asegúrate de tener la ruta correcta al archivo de conexión
import logger from '../utils/logger.js'; // Importa el logger
class DAORegistro {
static async registrar(usuario, descripcion, day) {
@ -6,10 +7,10 @@ class DAORegistro {
const conexionEstablecida = await conexion.conectar();
try {
const sql = "INSERT INTO registro (matricula, descripcion) VALUES (?, ?)";
const stm = await conexionEstablecida.query(sql, [usuario.getMatricula(), descripcion + day]);
const stm = await conexionEstablecida.query(sql, [usuario, descripcion + day]);
return stm.affectedRows > 0;
} catch (error) {
console.error(error);
logger.error(`Error en DAORegistro.registrar: ${error.message}`);
return false;
} finally {
conexion.cerrarConexion();

View File

@ -1,5 +1,7 @@
import Conexion from './Conexion.js'; // Asegúrate de tener la ruta correcta al archivo de conexión
import Tutor from '../Model/Tutor.js'; // Asegúrate de tener la ruta correcta al archivo de Tutor
import logger from '../utils/logger.js'; // Importa el logger
import DAORegistro from './DAORegistro.js'; // Asegúrate de tener la ruta correcta al archivo de DAORegistro
class DAOTutor {
@ -7,11 +9,17 @@ class DAOTutor {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `INSERT INTO tutor (nombre,apellido,numeroDeTelefono,idUsuario)VALUES(?,?,?,?);`;
const sql = `INSERT INTO tutor (nombre,apellido,numeroDeTelefono,idUsuario) VALUES (?,?,?,?);`;
const [result] = await conexionEstablecida.query(sql, [tutor.nombre, tutor.apellido, tutor.numeroDeTelefono, tutor.idUsuario]);
if (result.affectedRows > 0) {
// Registrar la operación
await DAORegistro.registrar({ getMatricula: () => tutor.idUsuario }, 'Agregó tutor', new Date().toISOString());
}
return result.affectedRows > 0;
} catch (error) {
console.error(error);
logger.error(`Error al agregar tutor: ${error.message}`);
return false;
} finally {
conexion.cerrarConexion();
@ -24,9 +32,15 @@ class DAOTutor {
try {
const sql = `UPDATE tutor SET nombre = ?, apellido = ?, numeroDeTelefono = ? WHERE idUsuario = ?`;
const [result] = await conexionEstablecida.query(sql, [tutor.nombre, tutor.apellido, tutor.numeroDeTelefono, tutor.idUsuario]);
if (result.affectedRows > 0) {
// Registrar la operación
await DAORegistro.registrar({ getMatricula: () => tutor.idUsuario }, 'Editó tutor', new Date().toISOString());
}
return result.affectedRows > 0;
} catch (error) {
console.error(error);
logger.error(`Error al editar tutor: ${error.message}`);
return false;
} finally {
conexion.cerrarConexion();
@ -46,7 +60,7 @@ class DAOTutor {
}
return null;
} catch (error) {
console.error(error);
logger.error(`Error al traer tutor: ${error.message}`);
return null;
} finally {
conexion.cerrarConexion();

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -10,12 +10,14 @@
"license": "ISC",
"dependencies": {
"body-parser": "^1.20.2",
"caller": "^1.1.0",
"cors": "^2.8.5",
"express": "^4.19.2",
"jsonwebtoken": "^9.0.2",
"multer": "^1.4.5-lts.1",
"mysql": "^2.18.1",
"mysql2": "^3.9.7",
"nodemailer": "^6.9.13",
"winston": "^3.13.0"
},
"devDependencies": {
@ -203,6 +205,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/caller": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/caller/-/caller-1.1.0.tgz",
"integrity": "sha512-n+21IZC3j06YpCWaxmUy5AnVqhmCIM2bQtqQyy00HJlmStRt6kwDX5F9Z97pqwAB+G/tgSz6q/kUBbNyQzIubw=="
},
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@ -1027,9 +1034,9 @@
}
},
"node_modules/mysql2": {
"version": "3.9.7",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz",
"integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==",
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.10.0.tgz",
"integrity": "sha512-qx0mfWYt1DpTPkw8mAcHW/OwqqyNqBLBHvY5IjN8+icIYTjt6znrgYJ+gxqNNRpVknb5Wc/gcCM4XjbCR0j5tw==",
"dependencies": {
"denque": "^2.1.0",
"generate-function": "^2.3.1",
@ -1082,6 +1089,14 @@
"node": ">= 0.6"
}
},
"node_modules/nodemailer": {
"version": "6.9.13",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz",
"integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/nodemon": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz",

View File

@ -12,12 +12,14 @@
"description": "",
"dependencies": {
"body-parser": "^1.20.2",
"caller": "^1.1.0",
"cors": "^2.8.5",
"express": "^4.19.2",
"jsonwebtoken": "^9.0.2",
"multer": "^1.4.5-lts.1",
"mysql": "^2.18.1",
"mysql2": "^3.9.7",
"nodemailer": "^6.9.13",
"winston": "^3.13.0"
},
"devDependencies": {

View File

@ -1,15 +1,17 @@
import express from 'express';
import bodyParser from 'body-parser';
import cors from 'cors';
import DAO from './Controller/DAO.js'; // Importa tus controladores DAO
import DAO from './Controller/DAO.js';
import DAOTutor from './Controller/DAOTutor.js';
import DAOCarreras from './Controller/DAOCarrera.js';
import Usuario from './Model/Usuario.js'; // Importa tus modelos
import Usuario from './Model/Usuario.js';
import multer from 'multer';
import path from 'path';
import { fileURLToPath } from 'url';
import DAODocumento from './Controller/DAODocumento.js';
import fs from 'fs';
import logger from './utils/logger.js';
import EmailCtrl from './utils/mailCtrl.js'
const app = express();
const port = 3000;
@ -19,7 +21,7 @@ const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const diskStorage = multer.diskStorage({
destination: path.join(__dirname, '/ActasNacimiento'),
destination: path.join(__dirname, '/Documentos'),
filename: (req, file, cb) => {
cb(null, file.originalname);
}
@ -33,12 +35,12 @@ app.use(bodyParser.json());
// Configuración de CORS
app.use(cors({
origin: 'http://localhost:5173', // Especifica el origen permitido
origin: 'http://localhost:5173',
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept'],
credentials: true
}));
app.use(express.static(path.join(__dirname,'ActasNacimiento')))
app.use(express.static(path.join(__dirname, 'Documentos')));
// Rutas
app.get("/matriculas", async (req, res) => {
@ -46,6 +48,7 @@ app.get("/matriculas", async (req, res) => {
const alumnos = await DAO.matriculas();
res.json(alumnos);
} catch (error) {
logger.error(`Error en /matriculas: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -57,6 +60,7 @@ app.post("/agregarAlumno", async (req, res) => {
const msj = await DAO.agregarAlumno(usuario);
res.json(msj);
} catch (error) {
logger.error(`Error en /agregarAlumno: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -67,6 +71,7 @@ app.put("/editarUsuario", async (req, res) => {
const verificado = await DAO.editarAlumno(usuario);
res.json({ Editado: verificado });
} catch (error) {
logger.error(`Error en /editarUsuario: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -77,6 +82,7 @@ app.put("/editarTutor", async (req, res) => {
const verificado = await DAOTutor.editarTutor(tutor);
res.json({ Editado: verificado });
} catch (error) {
logger.error(`Error en /editarTutor: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -87,6 +93,7 @@ app.post("/agregarTutor", async (req, res) => {
const agregado = await DAOTutor.agregarTutor(tutor);
res.json({ msj: agregado });
} catch (error) {
logger.error(`Error en /agregarTutor: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -110,6 +117,7 @@ app.post("/alumnoIniciado", async (req, res) => {
res.status(401).json({ error: "Credenciales inválidas" });
}
} catch (error) {
logger.error(`Error en /alumnoIniciado: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -120,6 +128,7 @@ app.post("/usuarioValido", async (req, res) => {
const verificado = await DAO.validarAlumno(usuario);
res.json({ existe: verificado });
} catch (error) {
logger.error(`Error en /usuarioValido: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -130,6 +139,7 @@ app.post("/traerDatosAlumno", async (req, res) => {
const datos = await DAO.traeUsuario(usuario.id);
res.json(datos);
} catch (error) {
logger.error(`Error en /traerDatosAlumno: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -139,6 +149,7 @@ app.get("/carreras", async (req, res) => {
const carreras = await DAOCarreras.dameCarreras();
res.json(carreras);
} catch (error) {
logger.error(`Error en /carreras: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
@ -149,18 +160,24 @@ app.post("/traerDatosTutor", async (req, res) => {
const datos = await DAOTutor.traerTutor(usuario.id);
res.json(datos);
} catch (error) {
logger.error(`Error en /traerDatosTutor: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
app.post("/agregarDocumentoAN", fileUpload, async (req, res) => {
app.post("/agregarDocumento", fileUpload, async (req, res) => {
try {
if (!req.file) {
return res.status(400).json({ error: "No se ha cargado ningún archivo" });
}
const data = req.body;
const file = fs.readFileSync(path.join(__dirname, '/ActasNacimiento/' + req.file.filename))
const filePath = path.join(__dirname, 'Documentos', req.file.filename);
const file = fs.readFileSync(filePath);
const guardado = await DAODocumento.agregarDocumento(data, file);
if (guardado) {
const cambiar = await DAO.editarAlumnoInscrito(data);
const cambiar = await DAO.editarAlumnoInscrito(data, 1);
if (cambiar) {
res.json({ message: true });
} else {
@ -170,19 +187,19 @@ app.post("/agregarDocumentoAN", fileUpload, async (req, res) => {
res.json({ message: false });
}
} catch (error) {
logger.error(`Error en /agregarDocumento: ${error.message}`);
res.status(500).json({ error: error.message });
logger.error(error);
}
});
// Manejo de errores
app.use((err, req, res, next) => {
console.error(err.stack);
logger.error(err.stack);
res.status(500).send('Something broke!');
});
// Iniciar el servidor
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
logger.info(`App listening at http://localhost:${port}`);
});
app.post("/traerTodosDatosAlumno", async (req, res) => {
@ -191,6 +208,39 @@ app.post("/traerTodosDatosAlumno", async (req, res) => {
const datos = await DAO.traeTodosLosDatosUsuario(usuario.id);
res.json(datos);
} catch (error) {
logger.error(`Error en /traerTodosDatosAlumno: ${error.message}`);
res.status(500).json({ error: error.message });
}
});
app.post("/iscribirAlumno", async (req, res) => {
try {
const usuario = req.body;
const datos = await DAO.iscribirUsuario(usuario);
if (datos) {
res.json({ message: true });
} else {
res.json({ message: false });
}
} catch (error) {
logger.error(`Error en /iscribirAlumno: ${error.message}`);
res.status(500).json({ error: error.message, message: false });
}
});
app.post("/regresarAlumno", async (req, res) => {
try {
const data = req.body;
const cambiar = await DAO.editarAlumnoRechazado(data, 0);
if (cambiar) {
res.json({ message: true });
} else {
res.json({ message: false });
}
} catch (error) {
logger.error(`Error en /regresarAlumno: ${error.message}`);
res.status(500).json({ error: error.message, message: false });
}
});
app.post('/email', EmailCtrl.sendEmail);

27
Server/utils/logger.js Normal file
View File

@ -0,0 +1,27 @@
import { createLogger, format, transports } from 'winston';
import caller from 'caller';
const myFormat = format.printf(info => {
const file = caller(); // Obtiene el archivo que llama al log
return `[${info.timestamp}] [${info.level}] ${info.message}`;
});
const logger = createLogger({
format: format.combine(
format.colorize(), // Agrega color
format.timestamp(),
myFormat
),
transports: [
new transports.File({
maxsize: 5120000,
maxFiles: 5,
filename: `./logs/log-api.log`
}),
new transports.Console({
level: 'debug'
})
]
});
export default logger;

37
Server/utils/mailCtrl.js Normal file
View File

@ -0,0 +1,37 @@
import nodemailer from 'nodemailer';
import DAORegistro from '../Controller/DAORegistro.js';
import logger from '../utils/logger.js';
class EmailCtrl {
static async sendEmail(req, res) {
const transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'drannet9@gmail.com',
pass: 'qnjkswqvuonuporj'
}
});
const mailOptions = {
from: 'drannet9@gmail.com',
to: req.body.correo,
subject: 'Registro',
text: 'Gracias por registrarse en Dran.net este es tu matricula: ' + req.body.matricula + ' y esta tu contraseña: ' + req.body.contrasena + ' No se te olvide anotarlas bien.'
};
try {
const info = await transporter.sendMail(mailOptions);
logger.info(`Email sent: ${info.response}`);
res.status(200).jsonp(req.body);
const descripcion = `Correo enviado a ${mailOptions.to}`;
const fecha = new Date();
await DAORegistro.registrar('SYSTEM', descripcion, fecha);
} catch (error) {
logger.error(`Error al enviar el correo: ${error}`);
res.status(500).send(error.message);
}
}
}
export default EmailCtrl;

View File

@ -1,3 +0,0 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
}

View File

@ -1,90 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mx.uv</groupId>
<artifactId>backend</artifactId>
<version>1.0-SNAPSHOT</version>
<name>backend</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<!-- This tells Maven to include all dependencies -->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>mx.uv.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,132 +0,0 @@
package mx.uv;
import static spark.Spark.*;
import java.util.HashMap;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import mx.uv.Controller.DAO;
import mx.uv.Controller.DAOTutor;
import mx.uv.Controller.DAO_Carrrera;
import mx.uv.Model.Mensaje;
import mx.uv.Model.Tutor;
import mx.uv.Model.Usuario;
public class App {
static Gson gson = new Gson();
static HashMap<String, Usuario> usuarios = new HashMap<>();
public static void main(String[] args) {
// Configuración de CORS
options("/*", (request, response) -> {
String accessControlRequestHeaders = request.headers("Access-Control-Request-Headers");
if (accessControlRequestHeaders != null) {
response.header("Access-Control-Allow-Headers", accessControlRequestHeaders);
}
String accessControlRequestMethod = request.headers("Access-Control-Request-Method");
if (accessControlRequestMethod != null) {
response.header("Access-Control-Allow-Methods", accessControlRequestMethod);
}
return "OK";
});
before((request, response) -> {
response.header("Access-Control-Allow-Origin", "http://localhost:5173");
response.header("Access-Control-Allow-Credentials", "true");
});
get("/todosLosAlumnos", (request, response) -> {
response.type("application/json");
return gson.toJson(DAO.dameAlumnos());
});
post("/agregarAlumno", (request, response) -> {
String payload = request.body();
Usuario usuario = gson.fromJson(payload, Usuario.class);
usuario.setRol("estudiante");
Mensaje msj = DAO.agregarAlumno(usuario);
JsonObject respuesta = new JsonObject();
respuesta.addProperty("contrasena", msj.getUsuario().getContrasena());
respuesta.addProperty("matricula", msj.getUsuario().getMatricula());
respuesta.addProperty("verificacion", msj.isVerificacion());
return respuesta;
});
put("/editarUsuario", (request, response) -> {
String payload = request.body();
Usuario usuario = gson.fromJson(payload, Usuario.class);
boolean verificado = DAO.editarAlumno(usuario);
JsonObject respuesta = new JsonObject();
respuesta.addProperty("Editado", verificado);
return respuesta;
});
put("/editarTutor", (request, response) -> {
String payload = request.body();
Tutor tutor = gson.fromJson(payload, Tutor.class);
boolean verificado = DAOTutor.editarTutor(tutor);
JsonObject respuesta = new JsonObject();
respuesta.addProperty("Editado", verificado);
return respuesta;
});
post("/agregarTutor", (request, response) -> {
String payload = request.body();
Tutor tutor = gson.fromJson(payload, Tutor.class);
Boolean agregado = DAOTutor.agregarTutor(tutor);
JsonObject respuesta = new JsonObject();
respuesta.addProperty("msj", agregado);
return respuesta;
});
post("/alumnoIniciado", (request, response) -> {
String payload = request.body();
response.type("application/json");
Usuario u = gson.fromJson(payload, Usuario.class);
if (u.getContrasena() == null || u.getMatricula() == null) {
response.status(400);
return gson.toJson("Missing matricula or contrasena");
}
Usuario usuario = DAO.alumnoIniciado(u.getMatricula(), u.getContrasena());
JsonObject respuesta = new JsonObject();
respuesta.addProperty("matricula", usuario.getMatricula());
respuesta.addProperty("authToken", usuario.crearToken());
respuesta.addProperty("authRol", usuario.getRol());
respuesta.addProperty("authId", usuario.getId());
respuesta.addProperty("message", "Binevenido " + usuario.getNombre());
return gson.toJson(respuesta);
});
post("/usuarioValido", (request, response) -> {
String payload = request.body();
Usuario usuario = gson.fromJson(payload, Usuario.class);
boolean verificado = DAO.validarAlumno(usuario);
JsonObject respuesta = new JsonObject();
respuesta.addProperty("existe", verificado);
return respuesta;
});
post("/traerDatosAlumno", (request, response) -> {
String payload = request.body();
response.type("application/json");
Usuario u = gson.fromJson(payload, Usuario.class);
return gson.toJson(DAO.traeUsuario(u.getId()));
});
get("/carreras", (request, response) -> {
response.type("application/json");
return gson.toJson(DAO_Carrrera.dameCarreras());
});
post("/traerDatosTutor", (request, response) -> {
String payload = request.body();
response.type("application/json");
Usuario u = gson.fromJson(payload, Usuario.class);
return gson.toJson(DAOTutor.tarerTutor(u.getId()));
});
}
}

View File

@ -1,57 +0,0 @@
package mx.uv.Controller;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Logger;
public class Conexion {
private static Connection conexion;
private static Conexion instancia;
private static final String url = "jdbc:mysql://localhost:3306/universidad";
private static final String user = "UserRemoto";
private static final String password = "password123";
private static final Logger logger = Logger.getLogger(Conexion.class.getName());
private Conexion() {
}
public static Conexion getInstance() {
if (instancia == null) {
synchronized (Conexion.class) {
if (instancia == null) {
instancia = new Conexion();
}
}
}
return instancia;
}
public Connection conectar() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conexion = DriverManager.getConnection(url, user, password);
if (conexion != null) {
logger.info("Conexión exitosa");
return conexion;
} else {
logger.severe("ERROR: No se pudo conectar");
}
} catch (Exception e) {
logger.severe("ERROR: " + e.getMessage());
}
return null;
}
public void cerrarConexion() {
try {
if (conexion != null && !conexion.isClosed()) {
conexion.close();
logger.info("Se desconectó de la base de datos");
}
} catch (SQLException e) {
logger.severe("ERROR: " + e.getMessage());
}
}
}

View File

@ -1,243 +0,0 @@
package mx.uv.Controller;
import java.sql.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.google.gson.JsonElement;
import mx.uv.Model.Usuario;
import mx.uv.Model.Mensaje;
import mx.uv.Model.Registro;
import java.sql.*;
import java.util.*;
import java.time.LocalDateTime;
public class DAO {
private static Conexion cn = Conexion.getInstance();
private static String nombreTabla = "usuario";
private static String colId = "id";
private static String colNombre = "nombre";
private static String colApellido = "apellido";
private static String colMatricula = "matricula";
private static String colContrasena = "contrasena";
private static String colCorreo = "correo";
private static String colNacionalidad = "nacionalidad";
private static String colTipoSangre = "tipoSangre";
private static String colFechaNacimiento = "fecha_nacimiento";
private static String colCurp = "curp";
private static String colRol = "rol";
private static String colIdCarrera = "idCarrera";
private static String colInscrito = "inscrito";
public static List<Usuario> dameAlumnos() {
Statement stm = null;
ResultSet rs = null;
Connection conn = null;
List<Usuario> resultado = new ArrayList<>();
conn = cn.conectar();
try {
String sql = "SELECT " + colId + " " + colNombre + " " + colApellido + " " + colMatricula + " from "
+ nombreTabla;
stm = conn.createStatement();
rs = stm.executeQuery(sql);
while (rs.next()) {
Usuario u = new Usuario(rs.getInt(colId), rs.getString(colNombre), rs.getString(colApellido),
rs.getString(colMatricula));
resultado.add(u);
}
} catch (Exception e) {
System.out.println(e);
} finally {
}
return resultado;
}
public static boolean validarAlumno(Usuario alumno) {
PreparedStatement stm = null;
Connection conn = null;
boolean verificacion = false;
ResultSet rs = null;
conn = cn.conectar();
try {
String sql = "SELECT * FROM " + nombreTabla + " WHERE " + colMatricula + " = ? AND " + colContrasena
+ " = ?";
stm = conn.prepareStatement(sql);
stm.setString(1, alumno.getMatricula());
stm.setString(2, alumno.getContrasena());
rs = stm.executeQuery();
if (rs.next()) {
verificacion = true;
} else {
verificacion = false;
}
} catch (SQLException ex) {
System.err.println(ex);
} finally {
}
return verificacion;
}
public static Mensaje agregarAlumno(Usuario usuario) {
Mensaje mensaje = new Mensaje();
PreparedStatement stm = null;
Connection conn = null;
String matricula = "SIU24" + (1000 + obtenerUltimoID());
String password = crearContrasena();
usuario.setContrasena(password);
usuario.setMatricula(matricula);
conn = cn.conectar();
try {
String sql = "INSERT INTO " + nombreTabla + " (" + colNombre + ", " + colApellido + ", " + colNacionalidad
+ ", " + colMatricula + ", " + colContrasena + ", " + colCorreo + ", " + colRol
+ ") VALUES (?, ?, ?, ?, ?, ?,?)";
stm = conn.prepareStatement(sql);
stm.setString(1, usuario.getNombre());
stm.setString(2, usuario.getApellido());
stm.setString(3, usuario.getNacionalidad());
stm.setString(4, usuario.getMatricula());
stm.setString(5, usuario.getContrasena());
stm.setString(6, usuario.getCorreo());
stm.setString(7, usuario.getRol());
if (stm.executeUpdate() > 0) {
mensaje.setVerificacion(true);
mensaje.setUsuario(usuario);
} else {
mensaje.setVerificacion(false);
}
} catch (Exception e) {
System.out.println(e);
} finally {
}
return mensaje;
}
public static String crearContrasena() {
Random random = new Random();
StringBuilder contrasena = new StringBuilder();
String CARACTERES_PERMITIDOS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#";
for (int i = 0; i < 10; i++) {
int numero = random.nextInt(CARACTERES_PERMITIDOS.length());
contrasena.append(CARACTERES_PERMITIDOS.charAt(numero));
}
return contrasena.toString();
}
public static boolean eliminarAlumno(int idAlumno) {
return false;
}
public static boolean editarAlumno(Usuario usuario) {
PreparedStatement stm = null;
Connection conn = null;
boolean verificacion = false;
conn = cn.conectar();
try {
String sql = "UPDATE `usuario` SET `nombre` = ?, `apellido` = ?, `correo` = ?, `nacionalidad` = ?, `tipoSangre` = ?, `fecha_nacimiento` = ?, `curp` = ?, `idCarrera` = ? WHERE `id` = ?;";
stm = conn.prepareStatement(sql);
stm.setString(1, usuario.getNombre());
stm.setString(2, usuario.getApellido());
stm.setString(3, usuario.getCorreo());
stm.setString(4, usuario.getNacionalidad());
stm.setString(5, usuario.getTipoSangre());
stm.setString(6, usuario.getFecha_nacimiento());
stm.setString(7, usuario.getCurp());
stm.setInt(8, usuario.getIdCarrera());
stm.setInt(9, usuario.getId());
if (stm.executeUpdate() > 0) {
verificacion = true;
}
} catch (SQLException ex) {
System.err.println(ex);
} finally {
cn.cerrarConexion();
}
return verificacion;
}
public static Usuario alumnoIniciado(String matricula, String contrasena) {
ResultSet rs = null;
Connection conn = null;
Usuario usuario = null;
conn = cn.conectar();
try {
String sql = "SELECT * FROM " + nombreTabla + " WHERE " + colMatricula + " = ? AND " + colContrasena
+ " = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, matricula);
stmt.setString(2, contrasena);
rs = stmt.executeQuery();
if (rs.next()) {
usuario = new Usuario(rs.getInt(colId), rs.getString(colNombre), rs.getString(colApellido),
rs.getString(colMatricula), rs.getString(colRol));
DAORegistro.registrar(usuario, "Inicio Sesión", LocalDateTime.now());
}
} catch (Exception e) {
System.out.println(e);
} finally {
}
return usuario;
}
public static int obtenerUltimoID() {
Connection conn = null;
Statement stm = null;
ResultSet rs = null;
int ultimoID = -1;
try {
conn = cn.conectar();
String sql = "SELECT MAX(" + colId + ") AS ultimo_id FROM " + nombreTabla;
stm = conn.createStatement();
rs = stm.executeQuery(sql);
if (rs.next()) {
ultimoID = rs.getInt("ultimo_id");
}
} catch (SQLException ex) {
System.err.println(ex);
} finally {
try {
if (rs != null)
rs.close();
if (stm != null)
stm.close();
if (conn != null)
conn.close();
} catch (SQLException ex) {
System.err.println(ex);
}
}
return ultimoID;
}
public static Usuario traeUsuario(int id) {
PreparedStatement stm = null;
Connection conn = null;
Usuario user = null;
ResultSet rs = null;
conn = cn.conectar();
try {
String sql = "SELECT `id`,`nombre`,`apellido`,`matricula`,`correo`,`nacionalidad`,`tipoSangre`,`fecha_nacimiento`,`curp`,`idCarrera`,`inscrito`\n"
+ //
"FROM `usuario` where id = ? ;";
stm = conn.prepareStatement(sql);
stm.setInt(1, id);
rs = stm.executeQuery();
while (rs.next()) {
user = new Usuario(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5),
rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getInt(10),
rs.getInt(11));
}
} catch (SQLException ex) {
System.err.println(ex);
} finally {
}
return user;
}
}

View File

@ -1,45 +0,0 @@
package mx.uv.Controller;
import java.time.LocalDateTime;
import java.sql.*;
import mx.uv.Model.Usuario;
public class DAORegistro {
private static Conexion cn = Conexion.getInstance();
public static void registrar(Usuario usuario, String descripcion, LocalDateTime day) {
PreparedStatement stm = null;
Connection conn = null;
conn = cn.conectar();
try {
String sql = "INSERT INTO `registro`(`matricula`,`descripcion`)VALUES(?,?);";
stm = (PreparedStatement) conn.prepareStatement(sql);
stm.setString(1, usuario.getMatricula());
stm.setString(2, descripcion + day);
stm.executeUpdate();
} catch (Exception e) {
System.out.println(e);
} finally {
cerrarConexiones(stm, conn);
}
}
private static void cerrarConexiones(PreparedStatement stm, Connection conn) {
if (stm != null) {
try {
stm.close();
} catch (Exception e) {
System.out.println(e);
}
stm = null;
}
try {
conn.close();
cn.cerrarConexion();
} catch (Exception e) {
System.out.println(e);
}
}
}

View File

@ -1,156 +0,0 @@
package mx.uv.Controller;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import mx.uv.Model.Tutor;
public class DAOTutor {
private static Conexion cn = Conexion.getInstance();
public static List<Tutor> dameTutores() {
Statement stm = null;
ResultSet rs = null;
Connection conn = null;
List<Tutor> resultado = new ArrayList<>();
conn = cn.conectar();
try {
String sql = "SELECT * from tutor";
stm = conn.createStatement();
rs = stm.executeQuery(sql);
while (rs.next()) {
Tutor u = new Tutor(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(5));
resultado.add(u);
}
} catch (Exception e) {
System.out.println(e);
} finally {
cerrarConexiones(null, conn);
}
return resultado;
}
public static boolean validarTutor(Tutor tutor) {
Statement stm = null;
Connection conn = null;
boolean verificacion = false;
ResultSet rs = null;
conn = cn.conectar();
try {
String sql = "select * from tutor "
+ "where id= '" + tutor.getId() + "' and nombre='" + tutor.getNombre() + "'";
stm = (Statement) conn.createStatement();
rs = stm.executeQuery(sql);
if (rs.next()) {
verificacion = true;
} else {
verificacion = false;
}
conn.close();
} catch (Exception ex) {
System.err.println(ex);
}
return verificacion;
}
public static boolean agregarTutor(Tutor tutor) {
PreparedStatement stm = null;
Connection conn = null;
boolean msj = false;
conn = cn.conectar();
try {
String sql = "INSERT INTO `tutor`(`nombre`,`apellido`,`parentesco`,`ocupacion`,`telefono`)VALUES(?,?,?,?,?);";
stm = (PreparedStatement) conn.prepareStatement(sql);
stm.setString(1, tutor.getNombre());
stm.setString(2, tutor.getApellido());
stm.setInt(3, tutor.getNumeroDeTelefono());
stm.setInt(4, tutor.getIdUsuario());
} catch (Exception e) {
System.out.println(e);
} finally {
// cerrarConexiones(stm, conn);
}
return msj;
}
private static void cerrarConexiones(PreparedStatement stm, Connection conn) {
if (stm != null) {
try {
stm.close();
} catch (Exception e) {
System.out.println(e);
}
stm = null;
}
try {
conn.close();
cn.cerrarConexion();
} catch (Exception e) {
System.out.println(e);
}
}
public static boolean eliminarTutor(Tutor tutor) {
return false;
}
public static boolean editarTutor(Tutor tutor) {
PreparedStatement stm = null;
Connection conn = null;
boolean verificacion = false;
conn = cn.conectar();
try {
String sql = "UPDATE `tutor` SET `nombre` = ?, `apellido` = ?, `numeroDeTelefono` = ? WHERE `idUsuario` = ?;";
stm = conn.prepareStatement(sql);
stm.setString(1, tutor.getNombre());
stm.setString(2, tutor.getApellido());
stm.setInt(3, tutor.getNumeroDeTelefono());
stm.setInt(4, tutor.getIdUsuario());
if (stm.executeUpdate() > 0) {
verificacion = true;
}
} catch (SQLException ex) {
System.out.println(ex);
} finally {
cerrarConexiones(stm, conn);
cn.cerrarConexion();
}
return verificacion;
}
public static Tutor tarerTutor(int id) {
PreparedStatement stm = null;
Connection conn = null;
Tutor tutor = null;
ResultSet rs = null;
conn = cn.conectar();
try {
String sql = "SELECT `id`,`nombre`,`apellido`,`numeroDeTelefono`,`idUsuario`\n"
+
"FROM `tutor` where idUsuario = ? ;";
stm = conn.prepareStatement(sql);
stm.setInt(1, id);
rs = stm.executeQuery();
if (rs.next()) {
tutor = new Tutor(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(5));
}
} catch (SQLException ex) {
System.err.println(ex);
} finally {
cerrarConexiones(stm, conn);
cn.cerrarConexion();
}
return tutor;
}
}

View File

@ -1,38 +0,0 @@
package mx.uv.Controller;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import mx.uv.Model.Carrera;
public class DAO_Carrrera {
private static Conexion cn = Conexion.getInstance();
public static List<Carrera> dameCarreras() {
Statement stm = null;
ResultSet rs = null;
Connection conn = null;
List<Carrera> resultado = new ArrayList<>();
System.out.println("Aqui");
conn = cn.conectar();
try {
String sql = "SELECT * from carrera";
stm = conn.createStatement();
rs = stm.executeQuery(sql);
while (rs.next()) {
Carrera u = new Carrera(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4),
rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8));
resultado.add(u);
}
} catch (Exception e) {
System.out.println(e);
} finally {
}
return resultado;
}
}

View File

@ -1,107 +0,0 @@
package mx.uv.Controller;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import mx.uv.Model.Documento;
public class DAO_Documentacion {
private static Conexion cn = Conexion.getInstance();
@SuppressWarnings("null")
public List<Documento> dameDocumentacion() {
Statement stm = null;
ResultSet rs = null;
Connection conn = null;
List<Documento> resultado = new ArrayList<>();
try {
String sql = "SELECT * from documentacion";
stm = conn.createStatement();
rs = stm.executeQuery(sql);
while (rs.next()) {
// Documento u = new Documento(rs.getInt(1), rs.getBytes(2),
// rs.getBytes(3),rs.getBytes(4), rs.getBytes(5),rs.getBytes(6), rs.getBytes(7),
// rs.getBytes(8), rs.getBytes(9), rs.getBytes(10));
// resultado.add(u);
}
} catch (Exception e) {
System.out.println(e);
} finally {
cerrarConexiones(null, conn);
}
return resultado;
}
public static boolean agregarDocumentacion(Documento documentacion) {
PreparedStatement stm = null;
Connection conn = null;
boolean msj = false;
conn = cn.conectar();
try {
String sql = "INSERT INTO `documentacion` (`id`,`acta_nacimiento`, `certificado_bachillerato`, `curp`, `ine`, `ine_tutor`, `certificado_medico`, `comprobante`, `fotografia`, `constancia`) VALUES(?,?,?,?,?,?,?,?,?,?);";
stm = (PreparedStatement) conn.prepareStatement(sql);
stm.setInt(1, documentacion.getId());
} catch (Exception e) {
System.out.println(e);
} finally {
cerrarConexiones(stm, conn);
}
return msj;
}
private static void cerrarConexiones(PreparedStatement stm, Connection conn) {
if (stm != null) {
try {
stm.close();
} catch (Exception e) {
System.out.println(e);
}
stm = null;
}
try {
conn.close();
cn.cerrarConexion();
} catch (Exception e) {
System.out.println(e);
}
}
public static boolean eliminarDocumentacion(int idDocumentacion) {
return false;
}
public static boolean agregarDocumento(Documento doc) {
PreparedStatement stm = null;
Connection conn = null;
boolean msj = false;
conn = cn.conectar();
String sql = "INSERT INTO documento (titulo, archivo, idUsuario, valido) VALUES (?, ?, ?, ?)";
try {
stm = conn.prepareStatement(sql);
stm.setString(1, doc.getTitulo());
stm.setBlob(2, doc.getArchivo());
stm.setInt(3, doc.getIdUsuario());
stm.setInt(4, doc.getValido());
if (stm.executeUpdate() > 0) {
msj = true;
}
} catch (SQLException e) {
e.printStackTrace();
// Manejar cualquier excepción y retornar falso en caso de error
}
return msj;
}
}

View File

@ -1,94 +0,0 @@
package mx.uv.Model;
public class Carrera {
private int id;
private String nombre;
private String area;
private String campus;
private String descripcion;
private String mision;
private String vision;
private String objetivo;
public Carrera(int id, String nombre, String area, String campus, String descripcion, String mision, String vision,
String objetivo) {
this.id = id;
this.nombre = nombre;
this.area = area;
this.campus = campus;
this.descripcion = descripcion;
this.mision = mision;
this.vision = vision;
this.objetivo = objetivo;
}
public Carrera(int id, String nombre, String area) {
this.id = id;
this.nombre = nombre;
this.area = area;
}
public void setCampus(String campus) {
this.campus = campus;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public void setMision(String mision) {
this.mision = mision;
}
public void setVision(String vision) {
this.vision = vision;
}
public void setObjetivo(String objetivo) {
this.objetivo = objetivo;
}
public String getCampus() {
return campus;
}
public String getDescripcion() {
return descripcion;
}
public String getMision() {
return mision;
}
public String getVision() {
return vision;
}
public String getObjetivo() {
return objetivo;
}
public int getId() {
return id;
}
public String getNombre() {
return nombre;
}
public String getArea() {
return area;
}
public void setId(int id) {
this.id = id;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setArea(String area) {
this.area = area;
}
}

View File

@ -1,59 +0,0 @@
package mx.uv.Model;
import java.io.InputStream;
public class Documento {
private int id;
private String titulo;
private InputStream archivo;
private int idUsuario;
private int valido;
public Documento(String titulo, InputStream archivo, int idUsuario, int valido) {
this.titulo = titulo;
this.archivo = archivo;
this.idUsuario = idUsuario;
this.valido = valido;
}
public int getId() {
return id;
}
public String getTitulo() {
return titulo;
}
public InputStream getArchivo() {
return archivo;
}
public int getIdUsuario() {
return idUsuario;
}
public int getValido() {
return valido;
}
public void setId(int id) {
this.id = id;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public void setArchivo(InputStream archivo) {
this.archivo = archivo;
}
public void setIdUsuario(int idUsuario) {
this.idUsuario = idUsuario;
}
public void setValido(int valido) {
this.valido = valido;
}
}

View File

@ -1,38 +0,0 @@
package mx.uv.Model;
public class Incripcion {
private int id;
private int idUusario;
private int idDocumento;
public Incripcion(int id, int idUusario, int idDocumento) {
this.id = id;
this.idUusario = idUusario;
this.idDocumento = idDocumento;
}
public void setId(int id) {
this.id = id;
}
public void setIdUusario(int idUusario) {
this.idUusario = idUusario;
}
public void setIdDocumento(int idDocumento) {
this.idDocumento = idDocumento;
}
public int getId() {
return id;
}
public int getIdUusario() {
return idUusario;
}
public int getIdDocumento() {
return idDocumento;
}
}

View File

@ -1,31 +0,0 @@
package mx.uv.Model;
public class Mensaje {
private boolean verificacion;
private Usuario usuario;
public Mensaje() {
}
public Mensaje(boolean verificacion, Usuario usuario) {
this.verificacion = verificacion;
this.usuario = usuario;
}
public boolean isVerificacion() {
return verificacion;
}
public Usuario getUsuario() {
return usuario;
}
public void setVerificacion(boolean verificacion) {
this.verificacion = verificacion;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
}

View File

@ -1,38 +0,0 @@
package mx.uv.Model;
public class Registro {
private int id;
private String matricula;
private String descripcion;
public Registro(int id, String matricula, String descripcion) {
this.id = id;
this.matricula = matricula;
this.descripcion = descripcion;
}
public void setId(int id) {
this.id = id;
}
public void setMatricula(String matricula) {
this.matricula = matricula;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public int getId() {
return id;
}
public String getMatricula() {
return matricula;
}
public String getDescripcion() {
return descripcion;
}
}

View File

@ -1,58 +0,0 @@
package mx.uv.Model;
public class Tutor {
private int id;
private String nombre;
private String apellido;
private int numeroDeTelefono;
private int idUsuario;
public Tutor(int id, String nombre, String apellido, int numeroDeTelefono, int idUsuario) {
this.id = id;
this.nombre = nombre;
this.apellido = apellido;
this.numeroDeTelefono = numeroDeTelefono;
this.idUsuario = idUsuario;
}
public int getId() {
return id;
}
public String getNombre() {
return nombre;
}
public String getApellido() {
return apellido;
}
public int getNumeroDeTelefono() {
return numeroDeTelefono;
}
public int getIdUsuario() {
return idUsuario;
}
public void setId(int id) {
this.id = id;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public void setNumeroDeTelefono(int numeroDeTelefono) {
this.numeroDeTelefono = numeroDeTelefono;
}
public void setIdUsuario(int idUsuario) {
this.idUsuario = idUsuario;
}
}

View File

@ -1,187 +0,0 @@
package mx.uv.Model;
import java.security.SecureRandom;
public class Usuario {
private int id;
private String nombre;
private String apellido;
private String matricula;
private String contrasena;
private String correo;
private String nacionalidad;
private String tipoSangre;
private String fecha_nacimiento;
private String curp;
private String rol;
private int idCarrera;
private int inscrito;
public Usuario(int id, String nombre, String apellido, String matricula, String contrasena, String correo,
String nacionalidad, String tipoSangre, String fecha_nacimiento, String curp, String rol, int idCarrera,
int inscrito) {
this.id = id;
this.nombre = nombre;
this.apellido = apellido;
this.matricula = matricula;
this.contrasena = contrasena;
this.correo = correo;
this.nacionalidad = nacionalidad;
this.tipoSangre = tipoSangre;
this.fecha_nacimiento = fecha_nacimiento;
this.curp = curp;
this.rol = rol;
this.idCarrera = idCarrera;
this.inscrito = inscrito;
}
public Usuario(int id, String nombre, String apellido, String matricula) {
this.id = id;
this.nombre = nombre;
this.apellido = apellido;
this.matricula = matricula;
}
public Usuario(int id, String nombre, String apellido, String matricula, String rol) {
this.id = id;
this.nombre = nombre;
this.apellido = apellido;
this.matricula = matricula;
this.rol = rol;
}
public Usuario(int id, String nombre, String apellido, String matricula, String correo, String nacionalidad,
String tipoSangre, String fecha_nacimiento, String curp, int idCarrera, int inscrito) {
this.id = id;
this.nombre = nombre;
this.apellido = apellido;
this.matricula = matricula;
this.correo = correo;
this.nacionalidad = nacionalidad;
this.tipoSangre = tipoSangre;
this.fecha_nacimiento = fecha_nacimiento;
this.curp = curp;
this.idCarrera = idCarrera;
this.inscrito = inscrito;
}
public Usuario(String matricula, String contrasena) {
this.matricula = matricula;
this.contrasena = contrasena;
}
public int getId() {
return id;
}
public String getNombre() {
return nombre;
}
public String getApellido() {
return apellido;
}
public String getMatricula() {
return matricula;
}
public String getContrasena() {
return contrasena;
}
public String getCorreo() {
return correo;
}
public String getNacionalidad() {
return nacionalidad;
}
public String getTipoSangre() {
return tipoSangre;
}
public String getFecha_nacimiento() {
return fecha_nacimiento;
}
public String getCurp() {
return curp;
}
public String getRol() {
return rol;
}
public int getIdCarrera() {
return idCarrera;
}
public int getInscrito() {
return inscrito;
}
public void setId(int id) {
this.id = id;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public void setMatricula(String matricula) {
this.matricula = matricula;
}
public void setContrasena(String contrasena) {
this.contrasena = contrasena;
}
public void setCorreo(String correo) {
this.correo = correo;
}
public void setNacionalidad(String nacionalidad) {
this.nacionalidad = nacionalidad;
}
public void setTipoSangre(String tipoSangre) {
this.tipoSangre = tipoSangre;
}
public void setFecha_nacimiento(String fecha_nacimiento) {
this.fecha_nacimiento = fecha_nacimiento;
}
public void setCurp(String curp) {
this.curp = curp;
}
public void setRol(String rol) {
this.rol = rol;
}
public void setIdCarrera(int idCarrera) {
this.idCarrera = idCarrera;
}
public void setInscrito(int inscrito) {
this.inscrito = inscrito;
}
public String crearToken() {
String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
SecureRandom random = new SecureRandom();
StringBuilder token = new StringBuilder(15);
for (int i = 0; i < 15; i++) {
int index = random.nextInt(CHARACTERS.length());
token.append(CHARACTERS.charAt(index));
}
return token.toString();
}
}

View File

@ -1,20 +0,0 @@
package mx.uv;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Unit test for simple App.
*/
public class AppTest
{
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue()
{
assertTrue( true );
}
}

View File

@ -37,6 +37,13 @@ const Inscripcion = () => {
idUsuario: 0,
valido: null
});
const [foto, setFoto] = useState({
id: 0,
titulo: "",
archivo: null,
idUsuario: 0,
valido: null
});
useEffect(() => {
const fetchData = async () => {
@ -112,7 +119,7 @@ const Inscripcion = () => {
}));
};
const handleFileChange = (e) => {
const handleFileActaChange = (e) => {
const file = e.target.files[0];
const fileName = `${usuario.matricula}_ActaN.pdf`;
const modifiedFile = new File([file], fileName, { type: file.type });
@ -123,6 +130,17 @@ const Inscripcion = () => {
}));
};
const handleFileFotoChange = (e) => {
const file = e.target.files[0];
const fileName = `${usuario.matricula}_Foto.jpg`;
const modifiedFile = new File([file], fileName, { type: file.type });
setFoto((prevFoto) => ({
...prevFoto,
archivo: modifiedFile
}));
};
const handleCarreraChange = (e) => {
const selectedCarreraId = e.target.value;
setCarreraSeleccionada(selectedCarreraId);
@ -159,12 +177,21 @@ const Inscripcion = () => {
formData.append('titulo', `${usuario.matricula}_ActaN`);
formData.append('archivo', actaN.archivo);
formData.append('idUsuario', usuario.id);
const reqs = await axios.post('/agregarDocumentoAN', formData,{
const reqs = await axios.post('/agregarDocumento', formData,{
headers: {
'Content-Type': 'multipart/form-data',
},
});
if (reqs){
const formDataFoto = new FormData();
formDataFoto.append('titulo', `${usuario.matricula}_Foto`);
formDataFoto.append('archivo', foto.archivo);
formDataFoto.append('idUsuario', usuario.id);
const requ = await axios.post('/agregarDocumento', formDataFoto,{
headers: {
'Content-Type': 'multipart/form-data',
},
});
if (reqs && requ){
window.location.reload();
}
} catch (error) {
@ -300,7 +327,17 @@ const Inscripcion = () => {
accept=".pdf"
placeholder="Acta de Nacimiento"
required
onChange={handleFileChange}
onChange={handleFileActaChange}
/>
<h6>Fotografia</h6>
<input
type="file"
name="archivo"
className="form-control mb-3"
accept=".jpg"
placeholder="Fotografia"
required
onChange={handleFileFotoChange}
/>
</div>
<button type="submit" className="btn btn-primary">Enviar Inscripción</button>

View File

@ -34,7 +34,14 @@ const Registro = () => {
if (res && res.verificacion) {
limpiar();
setMensaje(`Alumno Registrado Correctamente. Contraseña: ${res.contrasena}, Matrícula: ${res.matricula}`);
setMensaje(`Alumno Registrado Correctamente. Contraseña: ${res.contrasena} Matrícula: ${res.matricula} Se envio un correo elctronico.`);
try {
const data = {correo:alumno.correo, matricula: res.matricula, contrasena:res.contrasena }
const enviarEmail = await axios.post('/email',data)
} catch (error) {
console.log(error);
}
} else {
setError('Error: No se pudo Registrar');
}

View File

@ -6,6 +6,7 @@ const ValidacionAdm = () => {
const [alumno, setAlumno] = useState({});
const [matriculas, setMatriculas] = useState([]);
const [currentMatriculaIndex, setCurrentMatriculaIndex] = useState(0);
const [boton, setBoton]= useState(true);
useEffect(() => {
const fetchData = async () => {
@ -51,97 +52,139 @@ const ValidacionAdm = () => {
fetchAlumnoData(matriculas[newIndex].id);
}
};
const aceptarDocumento = ()=>{
alert("Documento aceptado");
setBoton(true);
}
const rechazarDocumento = ()=>{
alert("Documento Rechazado");
setBoton(false);
}
const iscribirAlumno = async ()=>{
const datos = {id: alumno.id, idCarrera: alumno.idCarrera}
try {
const res = await axios.post('http://localhost:3000/iscribirAlumno',datos);
if (res.data.message) {
alert("Alumno iscrito con exito")
window.location.reload();
}else{
alert("Error al iscribir el alumno intentelo mas tarde")
}
} catch (error) {
console.log(error);
}
}
const regresarDatos = async()=>{
const datos = {id: alumno.id}
try {
const res = await axios.post('http://localhost:3000/regresarAlumno',datos);
if (res.data.message) {
alert("Alumno rechazado")
window.location.reload();
}else{
alert("Error al rechazar el alumno intentelo mas tarde")
}
} catch (error) {
console.log(error);
}
}
if (loading) {
return <div>Loading...</div>;
}
return (
<div className="container mt-4">
<h1 className="text-center mb-4">Validación Administrativa</h1>
<div>
{matriculas.length > 0 ? (
<div className="container mt-4">
<h1 className="text-center mb-4">Validación Administrativa</h1>
<div className="input-group mb-3 justify-content-center">
<div className="input-group-prepend">
<button className="btn btn-sm p-0 border-0" type="button" onClick={handlePreviousMatricula}>
<img src="left-arrow.png" alt="Icono de flecha izquierda" style={{ width: '20px', height: '20px' }} />
</button>
</div>
<input
type="text"
className="form-control form-control-sm text-center"
style={{ maxWidth: '250px' }}
placeholder="Aqui aparece la matricula"
value={matriculas[currentMatriculaIndex].matricula}
readOnly
/>
<div className="input-group-append">
<button className="btn btn-sm p-0 border-0" type="button" onClick={handleNextMatricula}>
<img src="right-arrow.png" alt="Icono de flecha derecha" style={{ width: '20px', height: '20px' }} />
</button>
</div>
</div>
<div className="input-group mb-3 justify-content-center">
<div className="input-group-prepend">
<button className="btn btn-sm p-0 border-0" type="button" onClick={handlePreviousMatricula}>
<img src="left-arrow.png" alt="Icono de flecha izquierda" style={{ width: '20px', height: '20px' }} />
</button>
</div>
<input
type="text"
className="form-control form-control-sm text-center"
style={{ maxWidth: '250px' }}
placeholder="Aqui aparece la matricula"
value={matriculas[currentMatriculaIndex]?.matricula || ''}
readOnly
/>
<div className="input-group-append">
<button className="btn btn-sm p-0 border-0" type="button" onClick={handleNextMatricula}>
<img src="right-arrow.png" alt="Icono de flecha derecha" style={{ width: '20px', height: '20px' }} />
</button>
</div>
</div>
<div className="card mb-4">
<div className="card-body">
<h2 className="card-title">Datos del Alumno</h2>
<div className="row">
<div className="col-md-6">
<p className="card-text"><strong>Nombre:</strong> {alumno.nombre}</p>
<p className="card-text"><strong>Apellido:</strong> {alumno.apellido}</p>
<p className="card-text"><strong>Matricula:</strong> {alumno.matricula}</p>
<p className="card-text"><strong>Correo:</strong> {alumno.correo}</p>
<p className="card-text"><strong>Nacionalidad:</strong> {alumno.nacionalidad}</p>
<p className="card-text"><strong>Tipo de sangre:</strong> {alumno.tipoSangre}</p>
<p className="card-text"><strong>Fecha de nacimiento:</strong> {alumno.fecha_nacimiento}</p>
<p className="card-text"><strong>CURP:</strong> {alumno.curp}</p>
<p className="card-text"><strong>Carrera:</strong> {alumno.carreraNombre}</p>
<div className="card mb-4">
<div className="card-body">
<h2 className="card-title">Datos del Alumno</h2>
<div className="row">
<div className="col-md-6">
<p className="card-text"><strong>Nombre:</strong> {alumno.nombre}</p>
<p className="card-text"><strong>Apellido:</strong> {alumno.apellido}</p>
<p className="card-text"><strong>Matricula:</strong> {alumno.matricula}</p>
<p className="card-text"><strong>Correo:</strong> {alumno.correo}</p>
<p className="card-text"><strong>Nacionalidad:</strong> {alumno.nacionalidad}</p>
<p className="card-text"><strong>Tipo de sangre:</strong> {alumno.tipoSangre}</p>
<p className="card-text"><strong>Fecha de nacimiento:</strong> {alumno.fecha_nacimiento}</p>
<p className="card-text"><strong>CURP:</strong> {alumno.curp}</p>
<p className="card-text"><strong>Carrera:</strong> {alumno.carreraNombre}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="card mb-4">
<div className="card-body">
<h2 className="card-title">Datos del Tutor</h2>
<div className="row">
<div className="col-md-6">
<p className="card-text"><strong>Nombre:</strong> {alumno.tutorNombre}</p>
<p className="card-text"><strong>Apellido:</strong> {alumno.tutorApellido}</p>
<p className="card-text"><strong>Teléfono:</strong> {alumno.numeroDeTelefono}</p>
<div className="card mb-4">
<div className="card-body">
<h2 className="card-title">Datos del Tutor</h2>
<div className="row">
<div className="col-md-6">
<p className="card-text"><strong>Nombre:</strong> {alumno.tutorNombre}</p>
<p className="card-text"><strong>Apellido:</strong> {alumno.tutorApellido}</p>
<p className="card-text"><strong>Teléfono:</strong> {alumno.numeroDeTelefono}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="card mb-4">
<div className="card-body">
<h2 className="card-title">Documentos del Alumno</h2>
<div className="pdf-container mb-4">
<p className="card-text"><strong>Acta de Nacimiento:</strong></p>
<embed src={'http://localhost:3000/'+alumno.matricula+'_ActaN.pdf'} type="application/pdf" width="100%" height="300px" />
<div className="d-flex justify-content-center mt-3">
<button className="btn btn-primary btn-sm me-1">Aceptar Documentos</button>
<button className="btn btn-primary btn-sm ms-1">Rechazar Documentos</button>
<div className="card mb-4">
<div className="card-body">
<h2 className="card-title">Documentos del Alumno</h2>
<div className="pdf-container mb-4">
<p className="card-text"><strong>Acta de Nacimiento:</strong></p>
<embed src={'http://localhost:3000/'+alumno.matricula+'_ActaN.pdf'} type="application/pdf" width="100%" height="300px" />
<div className="d-flex justify-content-center mt-3">
<button onClick={aceptarDocumento} className="btn btn-primary btn-sm me-1">Aceptar Documentos</button>
<button onClick={rechazarDocumento} className="btn btn-primary btn-sm ms-1">Rechazar Documentos</button>
</div>
</div>
<div className="text-center mb-4 ">
<p className="card-text"><strong>Fotografía:</strong></p>
<img className='rounded' src={'http://localhost:3000/'+alumno.matricula+'_Foto.jpg'} />
<div className="d-flex justify-content-center mt-3">
<button onClick={aceptarDocumento} className="btn btn-primary btn-sm me-1">Aceptar Documentos</button>
<button onClick={rechazarDocumento} className="btn btn-primary btn-sm ms-1">Rechazar Documentos</button>
</div>
</div>
</div>
</div>
<div className="pdf-container mb-4">
<p className="card-text"><strong>Constancia de estudios:</strong></p>
<embed src={alumno.constanciaEstudios} type="application/pdf" width="100%" height="300px" />
<div className="d-flex justify-content-center mt-3">
<button className="btn btn-primary btn-sm me-1">Aceptar Documentos</button>
<button className="btn btn-primary btn-sm ms-1">Rechazar Documentos</button>
</div>
</div>
<div className="pdf-container mb-4">
<p className="card-text"><strong>Fotografía:</strong></p>
<embed src={alumno.fotografia} type="application/pdf" width="100%" height="300px" />
<div className="d-flex justify-content-center mt-3">
<button className="btn btn-primary btn-sm me-1">Aceptar Documentos</button>
<button className="btn btn-primary btn-sm ms-1">Rechazar Documentos</button>
<div>
<button onClick={iscribirAlumno} disabled={!boton} className="btn btn-primary btn-sm me-1">Aceptar Inscripción</button>
<button onClick={regresarDatos} className="btn btn-primary btn-sm ms-1">Solicitar Documentos de Nuevo</button>
</div>
</div>
</div>
</div>
) : (
<div className="d-flex justify-content-center align-items-center vh-100">
<div className="p-5 text-center bg-light border rounded shadow">
No hay alumnos inscritos aún.
</div>
</div>
)}
</div>
);
};