vista de administrador

This commit is contained in:
Soka_jplr 2024-05-26 13:06:55 -06:00
parent 41b16210f2
commit f50deaf29d
5 changed files with 325 additions and 191 deletions

View File

@ -4,16 +4,19 @@ import Mensaje from '../Model/Mensaje.js'; // Asegúrate de tener la ruta correc
import DAORegistro from './DAORegistro.js';
class DAO {
static async dameAlumnos() {
static async matriculas() {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `SELECT id, nombre, apellido, matricula FROM usuario`;
const sql = `SELECT id, matricula FROM usuario where inscrito = 1`;
const [rows] = await conexionEstablecida.query(sql);
const resultado = rows.map(row => new Usuario(row.id, row.nombre, row.apellido, row.matricula));
const resultado = rows.map(row => {
return { id: row.id, matricula: row.matricula };
});
return resultado;
} catch (error) {
console.error(error);
console.error(error); s
return [];
} finally {
conexion.cerrarConexion();
@ -155,6 +158,61 @@ class DAO {
}
return usuario;
}
static async editarAlumnoInscrito(data) {
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
]);
return result.affectedRows > 0;
} catch (error) {
} finally {
conexion.cerrarConexion();
}
}
static async traeTodosLosDatosUsuario(id) {
const conexion = new Conexion();
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 [rows] = await conexionEstablecida.query(sql, [id]);
if (rows.length > 0) {
const row = rows[0];
// Convertir la fecha al formato "yyyy-MM-dd"
const fechaNacimiento = new Date(row.fecha_nacimiento);
const formattedDate = fechaNacimiento.toISOString().split('T')[0]; // "yyyy-MM-dd"
usuario = {
id: row.id,
nombre: row.nombre,
apellido: row.apellido,
matricula: row.matricula,
correo: row.correo,
nacionalidad: row.nacionalidad,
tipoSangre: row.tipoSangre,
fecha_nacimiento: formattedDate,
curp: row.curp,
inscrito: row.inscrito,
tutorNombre: row.tutorNombre,
tutorApellido: row.tutorApellido,
numeroDeTelefono: row.numeroDeTelefono,
carreraNombre: row.carreraNombre
}
}
} catch (error) {
console.error(error);
} finally {
conexion.cerrarConexion();
}
return usuario;
}
}
export default DAO;

View File

@ -1,5 +1,6 @@
import express from 'express';
import bodyParser from 'body-parser';
import cors from 'cors';
import DAO from './Controller/DAO.js'; // Importa tus controladores DAO
import DAOTutor from './Controller/DAOTutor.js';
import DAOCarreras from './Controller/DAOCarrera.js';
@ -31,18 +32,18 @@ const fileUpload = multer({
app.use(bodyParser.json());
// Configuración de CORS
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "http://localhost:5173");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Credentials", "true");
next();
});
app.use(cors({
origin: 'http://localhost:5173', // Especifica el origen permitido
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept'],
credentials: true
}));
app.use(express.static(path.join(__dirname,'ActasNacimiento')))
// Rutas
app.get("/todosLosAlumnos", async (req, res) => {
app.get("/matriculas", async (req, res) => {
try {
const alumnos = await DAO.dameAlumnos();
const alumnos = await DAO.matriculas();
res.json(alumnos);
} catch (error) {
res.status(500).json({ error: error.message });
@ -159,9 +160,14 @@ app.post("/agregarDocumentoAN", fileUpload, async (req, res) => {
const guardado = await DAODocumento.agregarDocumento(data, file);
if (guardado) {
res.json({ message: "Archivo guardado correctamente" });
const cambiar = await DAO.editarAlumnoInscrito(data);
if (cambiar) {
res.json({ message: true });
} else {
res.json({ message: false });
}
} else {
res.json({ message: "No se pudo guardar el archivo" });
res.json({ message: false });
}
} catch (error) {
res.status(500).json({ error: error.message });
@ -178,3 +184,13 @@ app.use((err, req, res, next) => {
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
app.post("/traerTodosDatosAlumno", async (req, res) => {
try {
const usuario = req.body;
const datos = await DAO.traeTodosLosDatosUsuario(usuario.id);
res.json(datos);
} catch (error) {
res.status(500).json({ error: error.message });
}
});

View File

@ -18,7 +18,8 @@ const Inscripcion = () => {
tipoSangre: "",
fecha_nacimiento: "",
curp: "",
idCarrera: 0
idCarrera: 0,
inscrito:0
});
const [tutor, setTutor] = useState({
@ -53,7 +54,8 @@ const Inscripcion = () => {
tipoSangre: resUsuario.data.tipoSangre || "",
fecha_nacimiento: resUsuario.data.fecha_nacimiento || "",
curp: resUsuario.data.curp || "",
idCarrera: resUsuario.data.idCarrera || 0
idCarrera: resUsuario.data.idCarrera || 0,
inscrito: resUsuario.data.inscrito || 0
}));
} else {
console.log('Error: No hay usuario');
@ -157,155 +159,162 @@ const Inscripcion = () => {
formData.append('titulo', `${usuario.matricula}_ActaN`);
formData.append('archivo', actaN.archivo);
formData.append('idUsuario', usuario.id);
fetch('http://localhost:3000/agregarDocumentoAN',{
method: 'POST',
body: formData
}).then(res=>res.text())
.then(res => console.log(res))
.catch(err=>{
console.error(err)
})
setActaN(null)
const reqs = await axios.post('/agregarDocumentoAN', formData,{
headers: {
'Content-Type': 'multipart/form-data',
},
});
if (reqs){
window.location.reload();
}
} catch (error) {
console.error('Error al subir los datos:', error);
//window.location.reload();
}
};
return (
<div className='container'>
<div className='nbn'>
<form onSubmit={subir}>
<div className="mb-4">
<h5>Datos Personales</h5>
<DivInput
type="text"
name="nombre"
value={usuario.nombre}
className="form-control mb-3"
placeholder="Nombre"
required
handleChange={handleInputChange}
/>
<DivInput
type="text"
name="apellido"
value={usuario.apellido}
className="form-control mb-3"
placeholder="Apellido"
required
handleChange={handleInputChange}
/>
<DivInput
type="email"
name="correo"
value={usuario.correo}
className="form-control mb-3"
placeholder="Correo Electrónico"
required
handleChange={handleInputChange}
/>
<DivInput
type="text"
name="nacionalidad"
value={usuario.nacionalidad}
className="form-control mb-3"
placeholder="Nacionalidad"
required
handleChange={handleInputChange}
/>
<DivInput
type="text"
name="tipoSangre"
value={usuario.tipoSangre}
className="form-control mb-3"
placeholder="Tipo de Sangre"
required
handleChange={handleInputChange}
/>
<h6>Fecha de Nacimiento</h6>
<DivInput
type="date"
name="fecha_nacimiento"
value={usuario.fecha_nacimiento}
className="form-control mb-3"
placeholder="Fecha de Nacimiento"
required
handleChange={handleInputChange}
/>
<DivInput
type="text"
name="curp"
value={usuario.curp}
className="form-control mb-3"
placeholder="CURP"
required
handleChange={handleInputChange}
/>
<>
{usuario.inscrito !== 1 ? (
<div className='container'>
<div className='nbn'>
<form onSubmit={subir}>
<div className="mb-4">
<h5>Datos Personales</h5>
<DivInput
type="text"
name="nombre"
value={usuario.nombre}
className="form-control mb-3"
placeholder="Nombre"
required
handleChange={handleInputChange}
/>
<DivInput
type="text"
name="apellido"
value={usuario.apellido}
className="form-control mb-3"
placeholder="Apellido"
required
handleChange={handleInputChange}
/>
<DivInput
type="email"
name="correo"
value={usuario.correo}
className="form-control mb-3"
placeholder="Correo Electrónico"
required
handleChange={handleInputChange}
/>
<DivInput
type="text"
name="nacionalidad"
value={usuario.nacionalidad}
className="form-control mb-3"
placeholder="Nacionalidad"
required
handleChange={handleInputChange}
/>
<DivInput
type="text"
name="tipoSangre"
value={usuario.tipoSangre}
className="form-control mb-3"
placeholder="Tipo de Sangre"
required
handleChange={handleInputChange}
/>
<h6>Fecha de Nacimiento</h6>
<DivInput
type="date"
name="fecha_nacimiento"
value={usuario.fecha_nacimiento}
className="form-control mb-3"
placeholder="Fecha de Nacimiento"
required
handleChange={handleInputChange}
/>
<DivInput
type="text"
name="curp"
value={usuario.curp}
className="form-control mb-3"
placeholder="CURP"
required
handleChange={handleInputChange}
/>
</div>
<div className="mb-4">
<h5>Datos del Tutor</h5>
<DivInput
type="text"
name="nombre"
value={tutor.nombre}
className="form-control mb-3"
placeholder="Nombre"
required
handleChange={handleTutorInputChange}
/>
<DivInput
type="text"
name="apellido"
value={tutor.apellido}
className="form-control mb-3"
placeholder="Apellidos"
required
handleChange={handleTutorInputChange}
/>
<DivInput
type="tel"
name="numeroDeTelefono"
value={tutor.numeroDeTelefono}
className="form-control mb-3"
placeholder="Número de Teléfono"
required
handleChange={handleTutorInputChange}
/>
</div>
<div className="mb-4">
<h5>Carrera</h5>
<select
id="carreraSelect"
className="form-control"
value={carreraSeleccionada}
onChange={handleCarreraChange}
>
<option value="" disabled>Selecciona una carrera</option>
{carrera.map((carrera) => (
<option key={carrera.id} value={carrera.id}>
{carrera.nombre}
</option>
))}
</select>
</div>
<div className="mb-4">
<h5>Documentación</h5>
<h6>Acta De Nacimiento</h6>
<input
type="file"
name="archivo"
className="form-control mb-3"
accept=".pdf"
placeholder="Acta de Nacimiento"
required
onChange={handleFileChange}
/>
</div>
<button type="submit" className="btn btn-primary">Enviar Inscripción</button>
</form>
</div>
<div className="mb-4">
<h5>Datos del Tutor</h5>
<DivInput
type="text"
name="nombre"
value={tutor.nombre}
className="form-control mb-3"
placeholder="Nombre"
required
handleChange={handleTutorInputChange}
/>
<DivInput
type="text"
name="apellido"
value={tutor.apellido}
className="form-control mb-3"
placeholder="Apellidos"
required
handleChange={handleTutorInputChange}
/>
<DivInput
type="tel"
name="numeroDeTelefono"
value={tutor.numeroDeTelefono}
className="form-control mb-3"
placeholder="Número de Teléfono"
required
handleChange={handleTutorInputChange}
/>
</div>
<div className="mb-4">
<h5>Carrera</h5>
<select
id="carreraSelect"
className="form-control"
value={carreraSeleccionada}
onChange={handleCarreraChange}
>
<option value="" disabled>Selecciona una carrera</option>
{carrera.map((carrera) => (
<option key={carrera.id} value={carrera.id}>
{carrera.nombre}
</option>
))}
</select>
</div>
<div className="mb-4">
<h5>Documentación</h5>
<h6>Acta De Nacimiento</h6>
<input
type="file"
name="archivo"
className="form-control mb-3"
accept=".pdf"
placeholder="Acta de Nacimiento"
required
onChange={handleFileChange}
/>
</div>
<button type="submit" className="btn btn-primary">Enviar Inscripción</button>
</form>
</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">
Inscripción en Proceso, Validando los datos por favor revisa esta página dentro de una semana
</div>
</div>
)}
</>
);
};

View File

@ -1,47 +1,100 @@
import React, { useState } from 'react';
import axios from 'axios';
import React, { useState, useEffect } from 'react';
const ValidacionAdm = () => {
const [loading, setLoading] = useState(true);
const [alumno, setAlumno] = useState({});
const [matriculas, setMatriculas] = useState([]);
const [currentMatriculaIndex, setCurrentMatriculaIndex] = useState(0);
const handleLoad = () => {
setLoading(false);
useEffect(() => {
const fetchData = async () => {
try {
const resMatriculas = await axios.get('http://localhost:3000/matriculas');
if (resMatriculas.status === 200 && resMatriculas.data.length > 0) {
setMatriculas(resMatriculas.data);
await fetchAlumnoData(resMatriculas.data[0].id);
}
} catch (error) {
console.log(error);
} finally {
setLoading(false);
}
};
fetchData();
}, []);
const fetchAlumnoData = async (id) => {
try {
const resAlumno = await axios.post('http://localhost:3000/traerTodosDatosAlumno', { id: parseInt(id, 10) });
if (resAlumno.status === 200) {
setAlumno(resAlumno.data);
}
} catch (error) {
console.log(error);
}
};
const handlePreviousMatricula = () => {
if (currentMatriculaIndex > 0) {
const newIndex = currentMatriculaIndex - 1;
setCurrentMatriculaIndex(newIndex);
fetchAlumnoData(matriculas[newIndex].id);
}
};
const handleNextMatricula = () => {
if (currentMatriculaIndex < matriculas.length - 1) {
const newIndex = currentMatriculaIndex + 1;
setCurrentMatriculaIndex(newIndex);
fetchAlumnoData(matriculas[newIndex].id);
}
};
if (loading) {
return <div>Loading...</div>;
}
return (
<div className="container mt-4">
<h1 className="text-center mb-4">Validacion Administrativa</h1>
<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">
<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" />
<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">
<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> { } </p>
<p className="card-text"><strong>Apellido:</strong>{ } </p>
<p className="card-text"><strong>Matricula:</strong> { }</p>
<p className="card-text"><strong>Correo:</strong>{ } </p>
<p className="card-text"><strong>Nacionalidad:</strong>{ } </p>
<p className="card-text"><strong>Tipo de sangre:</strong>{ } </p>
<p className="card-text"><strong>Fecha de nacimiento:</strong>{ } </p>
<p className="card-text"><strong>CURP:</strong>{ } </p>
<p className="card-text"><strong>Carrera:</strong>{ } </p>
<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>
@ -52,9 +105,9 @@ const ValidacionAdm = () => {
<h2 className="card-title">Datos del Tutor</h2>
<div className="row">
<div className="col-md-6">
<p className="card-text"><strong>Nombre:</strong> { } </p>
<p className="card-text"><strong>Apellido:</strong>{ } </p>
<p className="card-text"><strong>Teléfono:</strong>{ }</p>
<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>
@ -62,35 +115,33 @@ const ValidacionAdm = () => {
<div className="card mb-4">
<div className="card-body">
<h2 className="card-title">Documentos de Alumno</h2>
<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={"mapa_curri_TC.pdf"} type="application/pdf" width="100%" height="300px" onLoad={handleLoad} />
<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>
</div>
<div className="pdf-container mb-4">
<p className="card-text"><strong>Constancia de estudios :</strong> </p>
<embed src={"mapa_curri_TC.pdf"} type="application/pdf" width="100%" height="300px" onLoad={handleLoad} />
<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>Fotografia:</strong> </p>
<embed src={"mapa_curri_TC.pdf"} type="application/pdf" width="100%" height="300px" onLoad={handleLoad} />
<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>
</div>
</div>
</div>
</div>
);
};