Sistema de venta de medicamentos en línea con SpringBoot, Vue y uniapp: arquitectura y desarrollo

Tecnologías utilizadas

SpringBoot ofrece integración con servidores como Tomcat y Jetty, simplificando el despliegue. Su configuración automática detecta dependencias y establece componentes sin intervención manual. Herramientas como Spring Data y Spring Security se incluyen, facilitando la construcción de aplicaciones escalables.

Vue.js emplea un modelo de DOM virtual que replica la interfaz en memoria, optimizando actualizaciones. Mediante enlace reactivo de datos y arquitectura basada en componentes, los cambios en el estado se reflejan en la vista de manera eficiente, reduciendo la manipulación directa del DOM.

MyBatis-Plus extiende MyBatis con funcionalidades como generación automática de código y consultas dinámicas. Soporta múltiples bases de datos y proporciona API para operaciones ORM, minimizando la escritura de SQL manual. Incluye características como paginación y bloqueo optimista para mejorar el rendimiento.

Pruebas del sistema

Las pruebas se centraron en validar la conformidad con los requisitos funcionales y detectar defectos. Se aplicaron técnicas de caja negra, simulando interaccionse del usuario para verificar lógica de negocio y manejo de errores.

Propósito de las pruebas

El objetivo principal era garantizar la estabilidad y usabilidad del sistema. Se analizaron casos de uso comunes para identificar discrepancias entre el comportamiento esperado y el real, asegurando una experiencia de usuario confiable.

Pruebas funcionales

Se diseñaron casos de prueba para módulos críticos como autenticación y gestión de usuarios. Por ejemplo, en el inicio de sesión se evaluaron credenciales válidas, contraseñas incorrectas y campos vacíos. Los resultados mostraron mensajes de error apropiados para cada escenario.

Datos de entrada Resultado esperado Resultado real Análisis
Usuario: admin1, Clave: 123456, Captcha: válido Acceso exitoso Sesión iniciada correctamente Coincide con expectativas
Usuario: admin1, Clave: errada, Captcha: válido Error de credenciales Mensaje: clave incorrecta Coincide con expectativas
Usuario: vacío, Clave: 123456, Captcha: válido Validación de campo requerido Mensaje: ingrese usuario Coincide con expectativas

Para la gestión de usuarios, se verificaron operaciones CRUD, incluyendo validación de duplicados y eliminación con confirmación. Las pruebas confirmaron que el sistema manejaba adecuadamente restricciones de datos.

Conclusión de pruebas

Las pruebas demostraron que el sistema cumple con las especificaciones funcionales. Se corrigieron errores menores relacionados con la validación de entradas, mejorando la robustez general.

Ejemplo de código: autenticación

@IgnorarAuth
@PostMapping("/iniciarSesion")
public Respuesta iniciarSesion(String usuario, String clave, String captcha, HttpServletRequest solicitud) {
    EntidadUsuario entidad = servicioUsuario.consultarUno(new EnvolturaEntidad<EntidadUsuario>().igual("nombre_usuario", usuario));
    if (entidad == null || !entidad.getClave().equals(clave)) {
        return Respuesta.error("Credenciales inválidas");
    }
    String ficha = servicioToken.generarFicha(entidad.getId(), usuario, "tabla_usuarios", entidad.getRol());
    return Respuesta.exitosa().agregar("ficha", ficha);
}

@Override
public String generarFicha(Long idUsuario, String usuario, String tabla, String rol) {
    EntidadToken fichaExistente = this.consultarUno(new EnvolturaEntidad<EntidadToken>().igual("id_usuario", idUsuario).igual("rol", rol));
    String valorFicha = UtilidadComun.cadenaAleatoria(32);
    Calendar calendario = Calendar.getInstance();
    calendario.add(Calendar.HOUR, 1);
    if (fichaExistente != null) {
        fichaExistente.setValorFicha(valorFicha);
        fichaExistente.setFechaExpiracion(calendario.getTime());
        this.actualizarPorId(fichaExistente);
    } else {
        this.insertar(new EntidadToken(idUsuario, usuario, tabla, rol, valorFicha, calendario.getTime()));
    }
    return valorFicha;
}

Estructura de base de datos: tabla de tokens

-- Eliminar tabla si existe
DROP TABLE IF EXISTS `tokens`;
CREATE TABLE `tokens` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Identificador principal',
  `id_usuario` bigint(20) NOT NULL COMMENT 'Referencia al usuario',
  `nombre_usuario` varchar(100) NOT NULL COMMENT 'Nombre del usuario',
  `nombre_tabla` varchar(100) DEFAULT NULL COMMENT 'Tabla asociada',
  `rol` varchar(100) DEFAULT NULL COMMENT 'Rol del usuario',
  `valor_token` varchar(200) NOT NULL COMMENT 'Token de autenticación',
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación',
  `fecha_expiracion` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Fecha de expiración',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='Almacena tokens de sesión';

-- Datos de ejemplo
INSERT INTO `tokens` (`id_usuario`, `nombre_usuario`, `nombre_tabla`, `rol`, `valor_token`, `fecha_creacion`, `fecha_expiracion`)
VALUES (23, 'cd01', 'tabla_estudiantes', 'Estudiante', 'ax7yz8qm9p0r1s2t3u4v5w6x7y8z9a0', '2023-02-23 21:46:45', '2023-03-15 14:01:36');
INSERT INTO `tokens` (`id_usuario`, `nombre_usuario`, `nombre_tabla`, `rol`, `valor_token`, `fecha_creacion`, `fecha_expiracion`)
VALUES (1, 'admin', 'tabla_usuarios', 'Administrador', 'b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5', '2023-02-27 19:37:01', '2023-03-17 18:23:02');

Etiquetas: SpringBoot vue.js MyBatis-Plus java MySQL

Publicado el 7-8 03:35