#+TITLE: MDIS #+SUBTITLE: Programación Web #+AUTHOR: Amin Kasrou Aouam #+DATE: 2020-07-16 #+PANDOC_OPTIONS: template:~/.pandoc/templates/eisvogel.latex #+PANDOC_OPTIONS: listings:t #+PANDOC_OPTIONS: toc:t #+PANDOC_METADATA: lang=es #+PANDOC_METADATA: titlepage:t #+PANDOC_METADATA: listings-no-page-break:t #+PANDOC_METADATA: toc-own-page:t #+PANDOC_METADATA: table-use-row-colors:t #+PANDOC_METADATA: logo:/home/coolneng/Photos/Logos/UGR.png * MDIS MDIS es un sistema de información que permite la gestión de una consulta médica. ** Funcionalidades - Gestión de Usuarios - Gestión de Pacientes - Gestión de Calendario - Gestión de Citas - Gestión de Vacaciones - Gestión de Informes ** Tecnologías - PHP - MySQL - Javascript - Fullcalendar - Jquery - JqueryUI - Nix ** Arquitectura #+CAPTION: Arquitectura del sistema [[./assets/F1.png]] Es un sistema web clásico, con la característica de que las consultas a la base de datos se realizan mediante /PDO/, para evitar vulnerabilidades del tipo /inyección de SQL/. Las operaciones que conllevan una inserción o transformación de datos se realizan en los archivos que terminan en *=_management.php=*, además de ésto, no hacemos ninguna consulta /SQL/ fuera del archivo *database.php*, lo que nos permite separar la lógica interna de la presentación. ** Estructura del proyecto La segmentación de los diferentes archivos de un proyecto es un aspecto que facilita mucho la búsqueda en un proyecto. La estructura de directorios es la siguiente: - database: archivos SQL para la creación de la base de datos. - docs: memoria del proyecto. - src: código fuente (PHP y Javascript). - src/static: bibliotecas de javascript, CSS y fotos. ** Dependencias El apartado de la gestión de citas se ha realizado utilizando la biblioteca [[https://fullcalendar.io/][FullCalendar]] de Javascript. La conexión entre el /backend/ y el /frontend/ se realiza mediante intercambio de JSON, la implementación se encuentra en los archivos que terminan en *=_feed.php=*. A partir de los elementos de la base de datos, formateados y transformados, obtenemos las citas, los festivos y la configuración del calendario de cada doctor. Finalmente, personalizamos el comportamiento del calendario según estos datos. Los elementos del calendario también requieren de [[https://jqueryui.com/][JqueryUI]], para darle un toque más moderno a los distintos componentes. La impresión de los informes en formato PDF es posible gracias a [[https://github.com/MrRio/jsPDF][jsPDF]], biblioteca simple y que produce documentos con un diseño cuidado. Por último, hacemos uso de la función /$.ajax()/ de [[https://jquery.com][Jquery]] para realizar peticiones /GET/ síncronas, dado que ciertos componentes de FullCalendar no pueden ser ejecutados como funciones asíncronas. ** Despliegue El desarrollo y despliegue del sistema se han hecho gracias a /Nix/, un gestor de paquetes que permite entornos de desarrollo y despliegue reproducibles. A continuación mostramos el código que define el entorno de desarrollo: #+BEGIN_SRC nix { pkgs ? import { } }: with pkgs; mkShell { # Definición de los paquetes buildInputs = [ php74 php74Extensions.pdo_mysql mysql57 ]; # Comandos que se ejecutan al entrar en la nix-shell shellHook = '' pkill mysql rm -rf .mysql && mkdir .mysql mysqld --datadir="$(pwd)/.mysql" --socket="$(pwd)/.mysql/mysql.sock" --initialize-insecure mysqld --datadir="$(pwd)/.mysql" --socket="$(pwd)/.mysql/mysql.sock" --skip-networking & sleep 1 mysql --socket="$(pwd)/.mysql/mysql.sock" -u root < $(pwd)/database/db.sql alias mysql='mysql --socket="$(pwd)/.mysql/mysql.sock" -u root' php -S localhost:8000 ''; } #+END_SRC Como podemos ver, /Nix/ nos permite: - Instalar las dependencias necesarias, en el ámbito de una shell - Ejecutar una base de datos temporal - Inicializar la base de datos - Lanzar el servidor web interno de PHP (se podría reemplazar por Apache/Nginx/...) El único comando que tenemos que ejecutar es: #+BEGIN_SRC shell nix-shell #+END_SRC Y ya dispondremos de un sistema funcional, y accesible en la URL *localhost:8000*.