cambio de frameWork

This commit is contained in:
Soka_jplr 2024-05-24 23:38:51 -06:00
parent f0f6c8bf47
commit 41b16210f2
17 changed files with 2555 additions and 0 deletions

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,38 @@
import mysql from 'mysql2/promise'; // Importa la versión de la biblioteca que soporta promesas
class Conexion {
constructor() {
this.conexion = null;
this.configuracion = {
host: 'localhost',
user: 'UserRemoto',
password: 'password123',
database: 'universidad'
};
}
async conectar() {
try {
this.conexion = await mysql.createConnection(this.configuracion);
console.log('Conexión exitosa a MySQL');
return this.conexion;
} catch (error) {
console.error('Error al conectar con la base de datos:', error.message);
return null;
}
}
cerrarConexion() {
if (this.conexion) {
this.conexion.end((err) => {
if (err) {
console.error('Error al cerrar la conexión con la base de datos:', err.message);
return;
}
console.log('Se desconectó de la base de datos');
});
}
}
}
export default Conexion;

160
Server/Controller/DAO.js Normal file
View File

@ -0,0 +1,160 @@
import Conexion from './Conexion.js'; // Asegúrate de tener la ruta correcta al archivo de conexión
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';
class DAO {
static async dameAlumnos() {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `SELECT id, nombre, apellido, matricula FROM usuario`;
const [rows] = await conexionEstablecida.query(sql);
const resultado = rows.map(row => new Usuario(row.id, row.nombre, row.apellido, row.matricula));
return resultado;
} catch (error) {
console.error(error);
return [];
} finally {
conexion.cerrarConexion();
}
}
static async validarAlumno(alumno) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `SELECT * FROM usuario WHERE matricula = ? AND contrasena = ?`;
const [rows] = await conexionEstablecida.query(sql, [alumno.getMatricula(), alumno.getContrasena()]);
return rows.length > 0;
} catch (error) {
console.error(error);
return false;
} finally {
conexion.cerrarConexion();
}
}
static async agregarAlumno(usuario) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const ultimoID = await this.obtenerUltimoID();
const matricula = "SIU24" + (1000 + ultimoID);
const password = this.crearContrasena();
usuario.contrasena = password;
usuario.matricula = matricula;
const sql = `INSERT INTO usuario (nombre, apellido, nacionalidad, matricula, contrasena, correo, rol) VALUES (?, ?, ?, ?, ?, ?, ?)`;
const [result] = await conexionEstablecida.query(sql, [
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);
} catch (error) {
console.error(error);
return new Mensaje(false, null);
} finally {
conexion.cerrarConexion();
}
}
static async editarAlumno(usuario) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `UPDATE usuario SET nombre = ?, apellido = ?, correo = ?, nacionalidad = ?, tipoSangre = ?, fecha_nacimiento = ?, curp = ?, idCarrera = ? WHERE id = ?`;
const [result] = await conexionEstablecida.query(sql, [
usuario.nombre, usuario.apellido, usuario.correo,
usuario.nacionalidad, usuario.tipoSangre, usuario.fecha_nacimiento,
usuario.curp, usuario.idCarrera, usuario.id
]);
return result.affectedRows > 0;
} catch (error) {
console.error(error);
return false;
} finally {
conexion.cerrarConexion();
}
}
static async alumnoIniciado(matricula, contrasena) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `SELECT * FROM usuario WHERE matricula = ? AND contrasena = ?`;
const [rows] = await conexionEstablecida.query(sql, [matricula, contrasena]);
if (rows.length > 0) {
const row = rows[0];
const usuario = new Usuario(
row.id, row.nombre, row.apellido, row.matricula, row.contrasena,
row.correo, row.nacionalidad,
row.tipoSangre, row.fecha_nacimiento, row.curp,
row.rol, row.idCarrera, row.inscrito
);
await DAORegistro.registrar(usuario, "Inicio Sesión", new Date());
return usuario;
}
return null;
} catch (error) {
console.error(error);
return null;
} finally {
conexion.cerrarConexion();
}
}
static async obtenerUltimoID() {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `SELECT MAX(id) AS ultimo_id FROM usuario`;
const [rows] = await conexionEstablecida.query(sql);
return rows[0].ultimo_id || -1;
} catch (error) {
console.error(error);
return -1;
} finally {
conexion.cerrarConexion();
}
}
static crearContrasena() {
const CARACTERES_PERMITIDOS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#";
let contrasena = '';
for (let i = 0; i < 10; i++) {
const index = Math.floor(Math.random() * CARACTERES_PERMITIDOS.length);
contrasena += CARACTERES_PERMITIDOS.charAt(index);
}
return contrasena;
}
static async traeUsuario(id) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
let usuario = null;
try {
const sql = `SELECT id, nombre, apellido, matricula, correo, nacionalidad, tipoSangre, fecha_nacimiento, curp, rol, idCarrera, inscrito FROM usuario WHERE 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 = new Usuario(
row.id, row.nombre, row.apellido, row.matricula, "", row.correo,
row.nacionalidad, row.tipoSangre, formattedDate, row.curp,
row.rol, row.idCarrera, row.inscrito
);
}
} catch (error) {
console.error(error);
} finally {
conexion.cerrarConexion();
}
return usuario;
}
}
export default DAO;

View File

@ -0,0 +1,22 @@
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
class DAOCarrera {
static async dameCarreras() {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
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));
return resultado;
} catch (error) {
console.error(error);
return [];
} finally {
conexion.cerrarConexion();
}
}
}
export default DAOCarrera;

View File

@ -0,0 +1,22 @@
import Conexion from './Conexion.js';
class DAODocumento {
static async agregarDocumento(req, file) {
const conexion = new Conexion();
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
]);
return result.affectedRows > 0;
} catch (error) {
console.log(error);
throw error;
} finally {
conexion.cerrarConexion();
}
}
}
export default DAODocumento;

View File

@ -0,0 +1,20 @@
import Conexion from './Conexion.js'; // Asegúrate de tener la ruta correcta al archivo de conexión
class DAORegistro {
static async registrar(usuario, descripcion, day) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = "INSERT INTO registro (matricula, descripcion) VALUES (?, ?)";
const stm = await conexionEstablecida.query(sql, [usuario.getMatricula(), descripcion + day]);
return stm.affectedRows > 0;
} catch (error) {
console.error(error);
return false;
} finally {
conexion.cerrarConexion();
}
}
}
export default DAORegistro;

View File

@ -0,0 +1,57 @@
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
class DAOTutor {
static async agregarTutor(tutor) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `INSERT INTO tutor (nombre,apellido,numeroDeTelefono,idUsuario)VALUES(?,?,?,?);`;
const [result] = await conexionEstablecida.query(sql, [tutor.nombre, tutor.apellido, tutor.numeroDeTelefono, tutor.idUsuario]);
return result.affectedRows > 0;
} catch (error) {
console.error(error);
return false;
} finally {
conexion.cerrarConexion();
}
}
static async editarTutor(tutor) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
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]);
return result.affectedRows > 0;
} catch (error) {
console.error(error);
return false;
} finally {
conexion.cerrarConexion();
}
}
static async traerTutor(id) {
const conexion = new Conexion();
const conexionEstablecida = await conexion.conectar();
try {
const sql = `SELECT id, nombre, apellido, numeroDeTelefono, idUsuario FROM tutor WHERE idUsuario = ?`;
const [rows] = await conexionEstablecida.query(sql, [id]);
if (rows.length > 0) {
const row = rows[0];
const tutor = new Tutor(row.id, row.nombre, row.apellido, row.numeroDeTelefono, row.idUsuario);
return tutor;
}
return null;
} catch (error) {
console.error(error);
return null;
} finally {
conexion.cerrarConexion();
}
}
}
export default DAOTutor;

80
Server/Model/Carrera.js Normal file
View File

@ -0,0 +1,80 @@
class Carrera {
constructor(id, nombre, area, campus, descripcion, mision, vision, 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;
}
// Getters
getId() {
return this.id;
}
getNombre() {
return this.nombre;
}
getArea() {
return this.area;
}
getCampus() {
return this.campus;
}
getDescripcion() {
return this.descripcion;
}
getMision() {
return this.mision;
}
getVision() {
return this.vision;
}
getObjetivo() {
return this.objetivo;
}
// Setters
setId(id) {
this.id = id;
}
setNombre(nombre) {
this.nombre = nombre;
}
setArea(area) {
this.area = area;
}
setCampus(campus) {
this.campus = campus;
}
setDescripcion(descripcion) {
this.descripcion = descripcion;
}
setMision(mision) {
this.mision = mision;
}
setVision(vision) {
this.vision = vision;
}
setObjetivo(objetivo) {
this.objetivo = objetivo;
}
}
export default Carrera;

29
Server/Model/Mensaje.js Normal file
View File

@ -0,0 +1,29 @@
class Mensaje {
constructor(verificacion, matricula, contrasena) {
this.verificacion = verificacion;
this.matricula = matricula;
this.contrasena = contrasena;
}
// Getter para la propiedad 'verificacion'
isVerificacion() {
return this.verificacion;
}
// Getter para la propiedad 'usuario'
getUsuario() {
return this.usuario;
}
// Setter para la propiedad 'verificacion'
setVerificacion(verificacion) {
this.verificacion = verificacion;
}
// Setter para la propiedad 'usuario'
setUsuario(usuario) {
this.usuario = usuario;
}
}
export default Mensaje;

39
Server/Model/Registro.js Normal file
View File

@ -0,0 +1,39 @@
class Registro {
constructor(id, matricula, descripcion) {
this.id = id;
this.matricula = matricula;
this.descripcion = descripcion;
}
// Getter para la propiedad 'id'
getId() {
return this.id;
}
// Getter para la propiedad 'matricula'
getMatricula() {
return this.matricula;
}
// Getter para la propiedad 'descripcion'
getDescripcion() {
return this.descripcion;
}
// Setter para la propiedad 'id'
setId(id) {
this.id = id;
}
// Setter para la propiedad 'matricula'
setMatricula(matricula) {
this.matricula = matricula;
}
// Setter para la propiedad 'descripcion'
setDescripcion(descripcion) {
this.descripcion = descripcion;
}
}
module.exports = Registro;

51
Server/Model/Tutor.js Normal file
View File

@ -0,0 +1,51 @@
class Tutor {
constructor(id, nombre, apellido, numeroDeTelefono, idUsuario) {
this.id = id;
this.nombre = nombre;
this.apellido = apellido;
this.numeroDeTelefono = numeroDeTelefono;
this.idUsuario = idUsuario;
}
getId() {
return this.id;
}
getNombre() {
return this.nombre;
}
getApellido() {
return this.apellido;
}
getNumeroDeTelefono() {
return this.numeroDeTelefono;
}
getIdUsuario() {
return this.idUsuario;
}
setId(id) {
this.id = id;
}
setNombre(nombre) {
this.nombre = nombre;
}
setApellido(apellido) {
this.apellido = apellido;
}
setNumeroDeTelefono(numeroDeTelefono) {
this.numeroDeTelefono = numeroDeTelefono;
}
setIdUsuario(idUsuario) {
this.idUsuario = idUsuario;
}
}
export default Tutor;

139
Server/Model/Usuario.js Normal file
View File

@ -0,0 +1,139 @@
class Usuario {
constructor(
id, nombre, apellido, matricula, contrasena, correo,
nacionalidad, tipoSangre, fecha_nacimiento, curp,
rol, idCarrera, inscrito
) {
this.id = id;
this.nombre = nombre;
this.apellido = apellido;
this.matricula = matricula;
this.contrasena = contrasena || ''; // Valor predeterminado para 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;
}
// Getters
getId() {
return this.id;
}
getNombre() {
return this.nombre;
}
getApellido() {
return this.apellido;
}
getMatricula() {
return this.matricula;
}
getContrasena() {
return this.contrasena;
}
getCorreo() {
return this.correo;
}
getNacionalidad() {
return this.nacionalidad;
}
getTipoSangre() {
return this.tipoSangre;
}
getFecha_nacimiento() {
return this.fecha_nacimiento;
}
getCurp() {
return this.curp;
}
getRol() {
return this.rol;
}
getIdCarrera() {
return this.idCarrera;
}
getInscrito() {
return this.inscrito;
}
// Setters
setId(id) {
this.id = id;
}
setNombre(nombre) {
this.nombre = nombre;
}
setApellido(apellido) {
this.apellido = apellido;
}
setMatricula(matricula) {
this.matricula = matricula;
}
setContrasena(contrasena) {
this.contrasena = contrasena;
}
setCorreo(correo) {
this.correo = correo;
}
setNacionalidad(nacionalidad) {
this.nacionalidad = nacionalidad;
}
setTipoSangre(tipoSangre) {
this.tipoSangre = tipoSangre;
}
setFecha_nacimiento(fecha_nacimiento) {
this.fecha_nacimiento = fecha_nacimiento;
}
setCurp(curp) {
this.curp = curp;
}
setRol(rol) {
this.rol = rol;
}
setIdCarrera(idCarrera) {
this.idCarrera = idCarrera;
}
setInscrito(inscrito) {
this.inscrito = inscrito;
}
crearToken() {
const CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let token = '';
for (let i = 0; i < 15; i++) {
const index = Math.floor(Math.random() * CHARACTERS.length);
token += CHARACTERS.charAt(index);
}
return token;
}
}
export default Usuario;

1663
Server/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

26
Server/package.json Normal file
View File

@ -0,0 +1,26 @@
{
"name": "server",
"version": "1.0.0",
"main": "index.js",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"body-parser": "^1.20.2",
"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",
"winston": "^3.13.0"
},
"devDependencies": {
"nodemon": "^3.1.0"
}
}

29
Server/routes/routes.js Normal file
View File

@ -0,0 +1,29 @@
import express from 'express';
import DAO from '../Controller/dao.js';// Asegúrate de que la ruta sea correcta
const router = express.Router();
router.post('/alumnoIniciado', async (req, res) => {
const { matricula, contrasena } = req.body;
try {
// Verificar si el alumno está en la base de datos
const usuario = await DAO.alumnoIniciado(matricula, contrasena);
if (usuario) {
// El alumno está autenticado correctamente
const authToken = usuario.crearToken();
const authRol = usuario.getRol();
const authId = usuario.getId();
const message = `Bienvenido ${usuario.getNombre()}`;
res.json({ matricula, authToken, authRol, authId, message });
} else {
// El alumno no está autenticado
res.status(401).json({ error: "Credenciales inválidas" });
}
} catch (error) {
console.error('Error al iniciar sesión:', error);
res.status(500).json({ error: "Error al iniciar sesión" });
}
});
export default router;

180
Server/server.js Normal file
View File

@ -0,0 +1,180 @@
import express from 'express';
import bodyParser from 'body-parser';
import DAO from './Controller/DAO.js'; // Importa tus controladores DAO
import DAOTutor from './Controller/DAOTutor.js';
import DAOCarreras from './Controller/DAOCarrera.js';
import Usuario from './Model/Usuario.js'; // Importa tus modelos
import multer from 'multer';
import path from 'path';
import { fileURLToPath } from 'url';
import DAODocumento from './Controller/DAODocumento.js';
import fs from 'fs';
const app = express();
const port = 3000;
// Obtener el directorio actual
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const diskStorage = multer.diskStorage({
destination: path.join(__dirname, '/ActasNacimiento'),
filename: (req, file, cb) => {
cb(null, file.originalname);
}
});
const fileUpload = multer({
storage: diskStorage
}).single('archivo');
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();
});
// Rutas
app.get("/todosLosAlumnos", async (req, res) => {
try {
const alumnos = await DAO.dameAlumnos();
res.json(alumnos);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post("/agregarAlumno", async (req, res) => {
try {
const usuario = req.body;
usuario.rol = "estudiante";
const msj = await DAO.agregarAlumno(usuario);
res.json(msj);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.put("/editarUsuario", async (req, res) => {
try {
const usuario = req.body;
const verificado = await DAO.editarAlumno(usuario);
res.json({ Editado: verificado });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.put("/editarTutor", async (req, res) => {
try {
const tutor = req.body;
const verificado = await DAOTutor.editarTutor(tutor);
res.json({ Editado: verificado });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post("/agregarTutor", async (req, res) => {
try {
const tutor = req.body;
const agregado = await DAOTutor.agregarTutor(tutor);
res.json({ msj: agregado });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post("/alumnoIniciado", async (req, res) => {
try {
const alumno = req.body;
const matricula = alumno.matricula;
if (!alumno.matricula || !alumno.contrasena) {
return res.status(400).json({ error: "Missing matricula or contrasena" });
}
const usuario = await DAO.alumnoIniciado(alumno.matricula, alumno.contrasena);
const user = new Usuario();
if (usuario) {
const authToken = user.crearToken();
const authRol = usuario.getRol();
const authId = usuario.getId();
const message = `Bienvenido ${usuario.getNombre()}`;
res.json({ matricula, authToken, authRol, authId, message });
} else {
res.status(401).json({ error: "Credenciales inválidas" });
}
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post("/usuarioValido", async (req, res) => {
try {
const usuario = req.body;
const verificado = await DAO.validarAlumno(usuario);
res.json({ existe: verificado });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post("/traerDatosAlumno", async (req, res) => {
try {
const usuario = req.body;
const datos = await DAO.traeUsuario(usuario.id);
res.json(datos);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.get("/carreras", async (req, res) => {
try {
const carreras = await DAOCarreras.dameCarreras();
res.json(carreras);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post("/traerDatosTutor", async (req, res) => {
try {
const usuario = req.body;
const datos = await DAOTutor.traerTutor(usuario.id);
res.json(datos);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post("/agregarDocumentoAN", fileUpload, async (req, res) => {
try {
const data = req.body;
const file = fs.readFileSync(path.join(__dirname, '/ActasNacimiento/' + req.file.filename))
const guardado = await DAODocumento.agregarDocumento(data, file);
if (guardado) {
res.json({ message: "Archivo guardado correctamente" });
} else {
res.json({ message: "No se pudo guardar el archivo" });
}
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Manejo de errores
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
// Iniciar el servidor
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});