Plataforma de Orientación para Estudiantes de Pregrado con SSM: Diseño e Implementación

Descripción del Sistema

Con el rápido avance de las tecnologías de información y internet, las empresas han adoptado masivamente sistemas de gestión personalizados. Este artículo detalla el proceso completo de desarrollo de una plataforma de orientación para estudiantes de pregrado. Tras analizar los requisitos específicos de las instituciones educativas para este tipo de sistema, se ha diseñado una solución informática para gestionar la relación entre tutores y estudiantes. Se presentan aspectos fundamentales del proyecto, incluyendo análisis de viabilidad, diseño funcional y modelado de bases de datos.

La plataforma de orientación para estudiantes de pregrado incorpora módulos para gestión de estudiantes, tutores, facultades, especialidades, promociones, grupos, semestres, listas de selección de tutores, mis tutores, tutores seleccionados, equipos de tutores, líneas de investigación, mis estudiantes, evaluaciones de estudiantes, evaluaciones de docentes, calificaciones académicas, centro de orientación y administración del sistema, lo que confiere al sistema una alta utilidad práctica.

El sistema se basa en arquitectura B/S (Navegador/Servidor), utilizando el framework SSM como tecnología principal, con MySQL como base de datos. Esta combinación garantiza la estabilidad y rendimiento del sistema. La plataforma destaca por su interfaz intuitiva, operación sencilla y funcionalidad completa, estandarizando y optimizando los procesos de gestión de la orientación académica.

Descripción Técnica

El código fuente está disponible al final del artículo

Lenguaje de desarrollo: Java

Framework técnico: SSM

Frontend: Vue\HTML

Framwork de persistencia: Mybatis

Servidor: Tomcat7\8\9\10

Base de datos: MySQL5.7+

Herramienta de gestión de proyectos: Maven

Entorno de desarrollo: IDEA\Eclipse

Demostración del Sistema

El administrador del sistema de plataforma de orientación para estudiantes de pregrado puede gestionar la información de los estudiantes, permitiendo operaciones de adición, modificación y eliminación. La interfaz correspondiente se muestra en la Figura 5.1.

El administrador del sistema también puede gestionar las promociones académicas. La interfaz específica se ilustra en la Figura 5.2.

El administrador del sistema puede visualizar los tutores asignados. La itnerfaz correspondiente se muestra en la siguiente imagen:

Tras iniciar sesión, los estudiantes pueden seleccionar tutores desde la lista disponible. La interfaz correspondiente se muestra a continuación:

Una vez identificados, los estudiantes pueden consultar información sobre sus tutores seleccionados. La interfaz correspondeinte se muestra en la siguiente imagen:

Los estudiantes registrados pueden acceder a la sección "Mis tutores". La interfaz correspondiente se muestra a continuación:

Implementación de Código:

Manejo de Solicitudes entre Dominios

package com.seguridad;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import com.anotacion.SaltaAutenticacion;
import com.entidad.Token;
import com.servicio.TokenServicio;
import com.utilidades.Respuesta;

/**
 * Interceptor para verificación de autenticación
 */
@Component
public class InterceptorAutenticacion implements HandlerInterceptor {

    public static final String CLAVE_TOKEN = "Token";

    @Autowired
    private TokenServicio tokenServicio;
    
	@Override
    public boolean preHandle(HttpServletRequest peticion, HttpServletResponse respuesta, Object manejador) throws Exception {

        // Configuración para solicitudes entre dominios
        respuesta.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        respuesta.setHeader("Access-Control-Max-Age", "3600");
        respuesta.setHeader("Access-Control-Allow-Credentials", "true");
        respuesta.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
        respuesta.setHeader("Access-Control-Allow-Origin", peticion.getHeader("Origin"));

        SaltaAutenticacion anotacion;
        if (manejador instanceof HandlerMethod) {
            anotacion = ((HandlerMethod) manejador).getMethodAnnotation(SaltaAutenticacion.class);
        } else {
            return true;
        }

        // Obtención del token desde los headers
        String token = peticion.getHeader(CLAVE_TOKEN);
        
        /**
         * Métodos que no requieren autenticación
         */
        if(anotacion!=null) {
        	return true;
        }
        
        Token tokenEntidad = null;
        if(StringUtils.isNotBlank(token)) {
        	tokenEntidad = tokenServicio.obtenerToken(token);
        }
        
        if(tokenEntidad != null) {
        	peticion.getSession().setAttribute("idUsuario", tokenEntidad.getIdUsuario());
        	peticion.getSession().setAttribute("rol", tokenEntidad.getRol());
        	peticion.getSession().setAttribute("tabla", tokenEntidad.getTabla());
        	peticion.getSession().setAttribute("nombreUsuario", tokenEntidad.getNombreUsuario());
        	return true;
        }
        
		PrintWriter escritor = null;
		respuesta.setCharacterEncoding("UTF-8");
		respuesta.setContentType("application/json; charset=utf-8");
		try {
		    escritor = respuesta.getWriter();
		    escritor.print(JSONObject.toJSONString(Respuesta.error(401, "Por favor inicie sesión")));
		} finally {
		    if(escritor != null){
		        escritor.close();
		    }
		}
		return false;
    }
}


Implementación de Inicio de Sesión


package com.controlador;


import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.anotacion.SaltaAutenticacion;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entidad.Token;
import com.entidad.Usuario;
import com.servicio.TokenServicio;
import com.servicio.UsuarioServicio;
import com.utilidades.CommonUtil;
import com.utilidades.MD5Util;
import com.utilidades.MPUtil;
import com.utilidades.Paginacion;
import com.utilidades.Respuesta;
import com.utilidades.ValidatorUtils;

/**
 * Controlador para operaciones de autenticación
 */
@RequestMapping("usuarios")
@RestController
public class ControladorUsuario{
	
	@Autowired
	private UsuarioServicio usuarioServicio;
	
	@Autowired
	private TokenServicio tokenServicio;

	/**
	 * Inicio de sesión
	 */
	@SaltaAutenticacion
	@PostMapping(value = "/ingresar")
	public Respuesta login(String nombreUsuario, String contrasena, String captcha, HttpServletRequest peticion) {
		Usuario usuario = usuarioServicio.seleccionarUno(new EntityWrapper<Usuario>().eq("nombreUsuario", nombreUsuario));
		if(usuario==null || !usuario.getContrasena().equals(contrasena)) {
			return Respuesta.error("Usuario o contraseña incorrectos");
		}
		String token = tokenServicio.generarToken(usuario.getId(),nombreUsuario, "usuarios", usuario.getRol());
		return Respuesta.ok().put("token", token);
	}
	
	/**
	 * Registro
	 */
	@SaltaAutenticacion
	@PostMapping(value = "/registro")
	public Respuesta registrar(@RequestBody Usuario usuario){
    	if(usuarioServicio.seleccionarUno(new EntityWrapper<Usuario>().eq("nombreUsuario", usuario.getNombreUsuario())) !=null) {
    		return Respuesta.error("El usuario ya existe");
    	}
        usuarioServicio.insertar(usuario);
        return Respuesta.ok();
    }

	/**
	 * Cierre de sesión
	 */
	@GetMapping(value = "salir")
	public Respuesta logout(HttpServletRequest peticion) {
		peticion.getSession().invalidate();
		return Respuesta.ok("Sesión cerrada exitosamente");
	}
	
	/**
     * Restablecer contraseña
     */
    @SaltaAutenticacion
	@RequestMapping(value = "/restablecerContrasena")
    public Respuesta resetPass(String nombreUsuario, HttpServletRequest peticion){
    	Usuario usuario = usuarioServicio.seleccionarUno(new EntityWrapper<Usuario>().eq("nombreUsuario", nombreUsuario));
    	if(usuario==null) {
    		return Respuesta.error("El usuario no existe");
    	}
    	usuario.setContrasena("123456");
        usuarioServicio.actualizar(usuario,null);
        return Respuesta.ok("La contraseña se ha restablecido a: 123456");
    }
	
	/**
     * Listado de usuarios
     */
    @RequestMapping("/pagina")
    public Respuesta pagina(@RequestParam Map<String, Object> params,Usuario usuario){
        EntityWrapper<Usuario> ew = new EntityWrapper<Usuario>();
    	Paginacion pagina = usuarioServicio.consultarPagina(params, MPUtil.ordenar(MPUtil.entre(MPUtil.todasLike(ew, usuario), params), params));
        return Respuesta.ok().put("data", pagina);
    }

	/**
     * Listado completo
     */
    @RequestMapping("/listado")
    public Respuesta listado( Usuario usuario){
       	EntityWrapper<Usuario> ew = new EntityWrapper<Usuario>();
      	ew.allEq(MPUtil.todasEQMapPre( usuario, "usuario")); 
        return Respuesta.ok().put("data", usuarioServicio.seleccionarVistaLista(ew));
    }

    /**
     * Información de usuario
     */
    @RequestMapping("/info/{id}")
    public Respuesta info(@PathVariable("id") String id){
        Usuario usuario = usuarioServicio.seleccionarPorId(id);
        return Respuesta.ok().put("data", usuario);
    }
    
    /**
     * Obtener información de usuario en sesión
     */
    @RequestMapping("/sesion")
    public Respuesta obtenerUsuarioActual(HttpServletRequest peticion){
    	Long id = (Long)peticion.getSession().getAttribute("idUsuario");
        Usuario usuario = usuarioServicio.seleccionarPorId(id);
        return Respuesta.ok().put("data", usuario);
    }

    /**
     * Guardar nuevo usuario
     */
    @PostMapping("/guardar")
    public Respuesta guardar(@RequestBody Usuario usuario){
    	if(usuarioServicio.seleccionarUno(new EntityWrapper<Usuario>().eq("nombreUsuario", usuario.getNombreUsuario())) !=null) {
    		return Respuesta.error("El usuario ya existe");
    	}
        usuarioServicio.insertar(usuario);
        return Respuesta.ok();
    }

    /**
     * Actualizar usuario existente
     */
    @RequestMapping("/actualizar")
    public Respuesta actualizar(@RequestBody Usuario usuario){
    	Usuario u = usuarioServicio.seleccionarUno(new EntityWrapper<Usuario>().eq("nombreUsuario", usuario.getNombreUsuario()));
    	if(u!=null && u.getId()!=usuario.getId() && u.getNombreUsuario().equals(usuario.getNombreUsuario())) {
    		return Respuesta.error("El nombre de usuario ya existe.");
    	}
        usuarioServicio.actualizarPorId(usuario);// actualización completa
        return Respuesta.ok();
    }

    /**
     * Eliminar usuarios
     */
    @RequestMapping("/eliminar")
    public Respuesta eliminar(@RequestBody Long[] ids){
        usuarioServicio.eliminarPorIds(Arrays.asList(ids));
        return Respuesta.ok();
    }
}


Etiquetas: SSM java MyBatis MySQL Vue

Publicado el 6-26 19:37