Aplicación Android y
Servicios REST para Compartir
Libros Electrónicos
Máster Universitario en Desarrollo Software para
Dispositivos Móviles
Trabajo Fin de Máster
Autor:
Javier Ortega Bastida
Tutor:
Agradecimientos
Índice de contenido
1. Justificación y Objetivos... 11
2. Introducción... 12
2.1. Estructura de la Memoria... 15
3. Estado del Arte... 16
3.1. Marco Teórico... 16
3.1.1. Diseño Responsive... 16
3.2.1. Servicios Web... 17
3.1.3. Tipos de Aplicaciones Móviles... 19
3.2. Proyectos Técnicos... 21 3.2.1. YouTube... 21 3.2.2. Bubok... 22 3.2.3. GitBook... 24 3.3. Estudio de la Competencia... 25 3.3.1. En la Web... 25
3.3.2. Mercado de las Apps... 26
4. Objetivos... 27 5. Metodología... 28 5.1. Diseño... 28 5.2. UML... 32 5.3. Tecnologías... 33 5.3.1. Laravel... 33 5.3.2. Servidor XAMPP... 38 5.3.3. HTML5, CSS y Boostrap... 40 5.3.4. IDE... 41 5.3.5. Control de Versiones... 41 5.4. Rutas de YouBook... 42 5.5. API RESTFul... 43 5.6. Arquitectura... 45 6. Desarrollo... 46
6.1. Implementación de la Aplicación Web... 46
6.1.1. Directorios de Laravel... 47
6.1.2. Definir las rutas... 48
6.1.3. Definir el Layout Principal... 49
6.1.4. Vista Principal: Listado de Libros...49
6.1.5. Funcionalidad de la Barra de Navegación...53
6.1.6. Subir un Libro... 58
6.1.7. Vista Información del Libro... 63
6.1.8. Editar y Eliminar un Libro... 69
6.1.9. Vista Perfil... 71
6.1.10. Editar y Eliminar Usuario... 75
6.1.11. Definir la API RESTFul... 78
6.2. Implementación de la Aplicación Android...78
6.2.1. Vista Principal... 80
Carga Lazy de Imágenes... 82
6.2.2. Toolbar... 83
6.2.3. Vista Información Libro... 86
6.2.4. Vista Perfil... 91
6.2.5. Añadir un Libro... 92
6.2.6. Vistas de Edición en la App... 97
7. Conclusiones y Trabajo Futuro...100
Índice de Figuras
Figura 1.1. Piratería en los Libros... 11
Figura 2.1. Icono YouBook... 12
Figura 2.2. YouBook... 13
Figura 2.3. App YouBook... 14
Figura 3.1. Diseño Responsive... 17
Figura 3.2. Cuerpo de una Petición REST... 18
Figura 3.3. Aplicaciones nativas: Android e iOS...19
Figura 3.4. Aplicaciones web: Sencha y jQuery...20
Figura 3.5. Aplicaciones híbridas: Ionic y PhoneGap...20
Figura 3.6. YouTube... 21
Figura 3.7. Listas en YouTube... 22
Figura 3.8. Página de Bubok... 23
Figura 3.9. Calculadora de Bubok... 23
Figura 3.10. Precio de venta en Bubok... 23
Figura 3.11. GitBook... 24
Figura 3.12. Edición de Documentos en GitBook...24
Figura 5.1. Diagrama de Flujo... 28
Figura 5.2. Vista Principal... 29
Figura 5.3. Acciones Básicas sin necesidad de Identificarse...30
Figura 5.4. Comentar y dar Me gusta a un libro...30
Figura 5.5. Subir un libro... 31
Figura 5.6. Editar libro... 31
Figura 5.7. Diagrama UML de la BD... 32
Figura 5.8. Icono Laravel... 33
Figura 5.9. Ejemplo de una Migración... 34
Figura 5.10. Ejemplo de Comando de Artisan...35
Figura 5.11. Patrón MVC... 36
Figura 5.12. Esquema de Funcionamiento de Larael...37
Figura 5.13. Icono de Composer... 37
Figura 5.15. Panel de Control de XAMPP...38
Figura 5.16. Panel de Control de PHPMyAdmin...39
Figura 5.17. Visualización de Tablas y su contenido...39
Figura 5.18. HTML, CSS y Boostrap... 40
Figura 5.19. Android Studio... 41
Figura 5.20. BitBucket... 41
Figura 5.21. Arquitectura YouBook... 45
Figura 6.1. Página por defecto de Laravel...46
Figura 6.2. Barra de Navegación de YouBook...49
Figura 6.3. Vista Principal... 50
Figura 6.4. Vista Principal en Tamaño Mediano...51
Figura 6.5. Vista Principal en Tamaño Pequeño...51
Figura 6.6. Vista Principal en Tamaño Extra Pequeño...52
Figura 6.7. Paginación... 53
Figura 6.8. Página Principal... 53
Figura 6.9. Barra de Búsqueda... 54
Figura 6.10. Resultado de la Búsqueda... 54
Figura 6.11. Donaciones Vía PayPal... 55
Figura 6.12. Vista del Login... 55
Figura 6.13. Correo no Registrado... 56
Figura 6.14. Registrar Usuario... 56
Figura 6.15. Sin Perfil... 57
Figura 6.16. Barra de Navegación tras Iniciar Sesión...57
Figura 6.17. Vista Subir Libro... 58
Figura 6.18. Errores de Validación... 59
Figura 6.19. Formulario Rellenando... 59
Figura 6.20. Directorio con las Portadas... 60
Figura 6.21. Directorio con los PDFs...61
Figura 6.22. Código Crear Libro... 61
Figura 6.23. Libro Añadido Correctamente...62
Figura 6.24. Vista Información Libro... 63
Figura 6.26. Leer un Cómic Online... 64
Figura 6.27. Dar Like a un Libro... 65
Figura 6.28. Libro Añadido a Favoritos... 65
Figura 6.29. Código para el Botón de Like... 66
Figura 6.30. Comentarios de un Libro... 67
Figura 6.31. Comentar un Libro... 67
Figura 6.32. Visualizando un Libro Subido por Nosotros...68
Figura 6.33. Vista Edición... 69
Figura 6.34. Excepción al Editar el Libro de otro Usuario...70
Figura 6.35. Vista Perfil Completa... 71
Figura 6.36. Pago PayPal a un Usuario... 72
Figura 6.37. Libros Subidos... 72
Figura 6.38. Pseudocódigo de un Carousel Dinámico...73
Figura 6.39. Libros Favoritos... 74
Figura 6.40. Carousel Responsive... 74
Figura 6.41. Detección del Propietario de la Cuenta...75
Figura 6.42. Vista Editar Perfil... 76
Figura 6.43. Excepción al Editar el Perfil de otro Usuario...76
Figura 6.44. Directorio Fotos de Perfil... 77
Figura 6.45. Perfil Editado Correctamente... 77
Figura 6.46. Editor de Temas... 79
Figura 6.47. Vista Principal App... 80
Figura 6.48. Alerta de Android... 81
Figura 6.49. Parsing de JSON... 82
Figura 6.50. Resultado de la Búsqueda App...83
Figura 6.51. Toolbar sin Identificase... 84
Figura 6.52. Diálogo para Iniciar Sesión... 84
Figura 6.53. Diálogo para Registrarse... 85
Figura 6.54. Toolbar tras Identificase... 85
Figura 6.55. Vista Información App... 86
Figura 6.56. Leer un Libro en la App... 87
Figura 6.58. Documentos Pesados... 88
Figura 6.59. Leyendo un Documento Pesado...89
Figura 6.60. Sistema de Comentarios App... 90
Figura 6.61. Vista Perfil App... 91
Figura 6.62. Vista Añadir Libro App... 92
Figura 6.63. Intent para cargar una Imagen...93
Figura 6.64. Código para obtener el contenido de un Proveedor...94
Figura 6.65. Archivos Extraídos del Proveedor de Contenidos...95
Figura 6.66. Código de envío de Ficheros desde Android a un Servidor...96
Figura 6.67. Libro Creado en la App... 96
Figura 6.68. Dispositivos que 3jecutan la API 19...97
Figura 6.69. Editar un Libro en la App... 98
Figura 6.70. Editar Perfil en la App... 98
Figura 7.1. Trabajo Futuro: Modelos 3D... 101 F
Índice de Tablas
Tabla 5.1. Rutas de YouBook... 42 Tabla 5.2. API RESTFul... 43
1.
Justificación y Objetivos
Uno de los principales problemas a los que los jóvenes escritores se enfrentan cuando deciden adentrarse en el mundo de la literatura es que las editoriales únicamente apuestan por escritores ya conocidos, impidiendo a los nuevos autores publicar sus obras.
Existe alternativas como la autopublicación que ofrecen plataformas como Amazon[48], pero cuyas políticas resultan abusivas al exigir la exclusividad de la obra (no pudiendo publicarla ni siquiera en el blog del autor), no permitiendo subir libros gratuitos y al quedarse con un elevado porcentaje de las ventas. Sumado al aspecto de la piratería, que cada vez dificulta más rentabilizar la publicación de libros (Figura 1.1), salvo por autores extranjeros sumamente conocidos (como Stephen King o J. K. Rowling), los neófitos que esperan vivir de la escritura ven sus sueños impedidos.
Figura 1.1. Piratería en los Libros
Por eso es tan necesaria una aplicación que facilite a los futuros escritores superar las grandes barreras de entrada de este competitivo negocio y poder economizar su actividad sin depender de las grandes editoriales. En este Proyecto de Fin de Máster se desea desarrollar una aplicación web y Android[5] que solvente estos problemas a través de una plataforma que permita a los autores publicar y rentabilizar sus obras. Por lo tanto, el objetivo que se pretende alcanzar es la creación de una red social que pueda disfrutarse tanto en el navegador como en un dispositivo móvil. Que permita la gestión de usuarios y sus libros subidos mediante la implementación de un servidor para poder descargarlos (tanto en el navegador como en el dispositivo móvil), así como otras acciones como poder decir que le gusta un libro. Y por supuesto, que ejerza como medio publicitario para dar a conocer a los escritores y como medio de financiación a través de micropagos.
2.
Introducción
Una vez establecida la necesidad de una plataforma que ayude a dar a conocer a los escritores, así como un modelo de difusión y financiación de su trabajo ajeno a las editoriales (aunque gracias a nuestro sitio web, un autor exitoso podría causar interés en dichas editoriales), vamos a explicar el trabajo realizado para alcanzar dicho propósito. Por ello nace YouBook (Figura 2.1), una red social en la que los adeptos a la literatura podrán compartir libros (ya sean propios o de otros autores) y hacerse notar en el mundo literario.
Figura 2.1. Icono YouBook
Para implementar el servidor web, instalaremos Composer[10], un gestor de dependencias para el lenguaje de programación web PHP[11] que permite gestionar las librerías y dependencias con las versiones que el proyecto requiera. Una vez instalado Composer en nuestro ordenador, podremos instalar Laravel[3], un framework de código abierto pensado para el desarrollo de aplicaciones web en PHP.
Durante la fase de desarrollo, crearemos el proyecto Laravel en un servidor web local llamado XAMPP[12], el cual nos proporcionará un intérprete de PHP y una extensión de MySQL para la gestión de una Base de Datos donde almacenaremos la información de las entidades que intervienen en la aplicación, como pueden ser los usuarios registrados y sus libros publicados.
La aplicación web, es decir, el servidor, presentará al usuario una serie de acciones, algunas de ellas únicamente accesibles si se ha iniciado sesión. Sin embargo, todas las operaciones de visualización serán públicas, ya sea para poder leer o
descargar un libro, o para vislumbrar la información del perfil del autor que lo compartió.
Cuando el usuario entre en la web, se le presentarán los libros compartidos comenzando por las publicaciones más recientes (Figura 2.2). Definiremos una serie de rutas con las acciones que detallaremos más adelante (registrase, iniciar sesión, visualizar un libro, descargarlo, darle “like”, comentar, etc.) y unos controladores que gestionarán dichas acciones y accederán a la Base de Datos para actualizarla. La web también ofrecerá a los visitantes la posibilidad de hacer donaciones vía PayPal, ya sea para ayudar a mantener el sitio web como para donar a un autor en particular.
Figura 2.2. YouBook
Las vistas que crearemos en nuestro proyecto Laravel contendrán código en HTML mezclado con PHP y elementos de CSS, lo que nos facilitará alcanzar el principio de de diseño Responsive[14]. Gracias al sistema de rejilla de Boostrap (una librería CSS)[16] podremos hacer que la interfaz de la web se autoajuste a los distintos tamaños de pantalla. El servidor ofrecerá un Servicio Web para intercambiar datos y recursos con las aplicaciones que deseen acceder a él, para de esa forma obtener la información almacenada de los usuarios y sus libros y mostrarla en la aplicación externa.
Cuando la aplicación web esté finalizada, implementaremos una aplicación cliente que solicitará la información al servidor desde el dispositivo móvil. Será una aplicación Android (Figura 2.3) que permitirá al usuario realizar las mismas acciones de la web en el teléfono.
Figura 2.3. App YouBook
Todas las peticiones al servidor harán uso de la arquitectura REST[4] (que incluso nos permitirá el envío de archivos como imágenes y PDFs tanto desde el servidor como desde el móvil) que serán gestionadas por la API del servidor y que devolverá una respuesta en formato JSON que el cliente procesará. De esta forma se
podrán publicar o leer libros tanto como si se está en casa frente al ordenador o de viaje con un dispositivo que cuente con el sistema Android. La aplicación se ajustará a distintos tamaños de dispositivo gracias a que los elementos visuales harán uso de etiquetas de Android en XML como los ListView[34] o RecyclerView[43]. Para implementar la App utilizaremos el entorno de desarrollo (IDE) de Android Studio[13].
2.1. Estructura de la Memoria
A lo largo del documento seguiremos una estructura muy concreta de modo que el lector pueda realizar un correcto seguimiento de todos los aspectos que se han considerado en este proyecto final. Una vez explicada la justificación y presentada la introducción de este trabajo, comentaremos el estado del arte de distintos proyectos que nos han servido de inspiración y guía para saber los aspectos a considerar. Acto seguido plantearemos unos objetivos mínimos a conseguir. Seguiremos con la metodología, en la que haremos una breve descripción de las tecnologías empleadas, nuestra arquitectura y tecnologías utilizadas, así como la presentación de los mockups de los diseños iniciales. Luego mostraremos en el apartado de desarrollo todo el trabajo realizado y la forma de alcanzar los objetivos planteados. Y, tras el apartado del desarrollo, llegaremos a unas conclusiones para corroborar si hemos alcanzado dichos objetivos.
3.
Estado del Arte
En esta sección vamos a exponer una serie de trabajos realizados por otros desarrolladores dentro de un marco teórico y técnico. Han servido de inspiración tanto de los pasos a seguir como de los diferentes aspectos a tener en cuenta en el modelo de negocio, publicitario y de diseño. También analizaremos qué ventajas ofrece nuestra aplicación frente a la competencia, como por ejemplo en el ámbito económico, y qué oportunidades podemos alcanzar para adentrarnos en un nicho de negocio en particular.
3.1. Marco Teórico
Vamos a contemplar los aspectos teóricos de diferentes estudios para definir los principios del desarrollo de aplicaciones web y de aplicaciones móviles que hagan uso de peticiones en la red a un servidor, así como los conceptos y definiciones que entran en juego en la conexión para más adelante, en el apartado de implementación, veamos cómo tienen efecto en la práctica de nuestro proyecto.
3.1.1. Diseño Responsive
El diseño web Responsive[14] es una técnica de diseño cuyo objetivo es adaptar las apariencias de las páginas web al tamaño de pantalla de los diferentes dispositivos que lo estén visualizando. Debido a que hoy en día existe una gran variedad de dispositivos desde donde acceder a los sitios web (un ordenador de escritorio, un portátil, un tablet, un teléfono móvil, etc.), el uso de la tecnología responsive pretende que, con un solo diseño, la vista de la página sea visualizada correctamente con independencia del tamaño de pantalla. De esta forma, al diseñar una única vista que se adapte dinámicamente, permite reducir tiempo de producción. Existen diversos framework responsive para el desarrollo de nuestra web: Foundation[17], Skeleton[18], HTML5 Boilerplate[19] o Boostrap[16], uno de los más populares.
En la siguiente figura (Figura 3.1) podemos contemplar el funcionamiento del diseño responsive de una web ajustando el contenido a las distintas dimensiones del hardware.
Figura 3.1. Diseño Responsive [15]
3.2.1. Servicios Web
Otro elemento importante para entender cómo acceder a los datos de un servidor desde una aplicación externa (como por ejemplo una aplicación Android) son los Servicios Web. Desde un dispositivo móvil podemos conectarnos a un servidor de dos formas: mediante el navegador o mediante una aplicación. Normalmente, cuando una aplicación móvil se conecta a un servidor, no solicita el documento web (a diferencia del navegador que solicita el documento HTML), sino que solicita los servicios para poder realizar alguna operación u obtener información. Cuando se accede a estos servicios mediante protocolos web, como HTTP[20], hablamos de Servicios Web.
Existen diferentes estilos para crear un Servicio Web:
SOAP[21]. Es un protocolo estándar en XML para la creación de servicios que permite consumirlos de forma idéntica con independencia de la plataforma implementada. Ofrece una fácil integración en cualquier lenguaje de programación, por lo que es independiente del lenguaje, así como una neutralidad sobre el protocolo de transporte. Pero cuenta con la problemática de que obliga a definir un archivo XML demasiado pesado, lo que lo hace inconveniente para los dispositivos móviles. SOAP suele ser más utilizado para grandes aplicaciones.
REST[4]. Pero con el tiempo, para la web y dispositivos móviles que deseen conectarse al servidor, se ha impuesto la arquitectura REST(Representational State Transfer). Mediante REST, el servidor ofrece servicios a los que se accede a través de las URLs con protocolos como HTTP (que también incluye métodos para cachear las peticiones y un código de respuesta para indicar si todo salió correctamente o hubo algún fallo). Accediendo a dicha URL, podremos realizar alguna acción en el servidor u obtener información. Los Servicios Web que usan la arquitectura REST, son llamados Servicios Web RESTFul. Los servicios RESTFul han de definir una serie de elementos: Los recursos identificados por una URI (Universal Resource Identifier) para que las aplicaciones externas accedan a ellos. El tipo de representación de los recursos, es decir, el formato de las peticiones del cliente y las respuestas del servidor, generalmente en formato JSON, XML o texto plano. Y las operaciones que se pueden realizar, para lo cual HTTP define cuatro acciones básicas:
GET: Para obtener información de un recurso. PUT: Para actualizar un recurso.
POST: Para crear un recurso. DELETE: Para eliminar un recurso.
En la siguiente imagen(Figura 3.2), podemos ver el aspecto de una petición REST que podría realizar una aplicación cliente a un servidor.
3.1.3. Tipos de Aplicaciones Móviles
El último concepto que debemos entender es que existen diferentes formas de implementar una aplicación para un dispositivo móvil:
Aplicaciones Nativas. Son las que han sido desarrolladas haciendo uso de las funcionalidades específicas que ofrece el sistema operativo y el software del dispositivo. Por ejemplo, para un sistema Android(Figura 3.4), haciendo uso del SDK de Android y de la API de sus librerías, y lo mismo para el sistema iOS[22].
Figura 3.3. Aplicaciones nativas: ANDROID e iOS
Las aplicaciones nativas nos ofrecen la ventaja de poseer un acceso completo a las funcionalidades del teléfono, ya que han sido diseñadas específicamente para el dispositivo, lo que ofrece una mejor experiencia al usuario y permite tener la aplicación en constante actualización. Aunque cuenta con el inconveniente de que las empresas han de tener un equipo de desarrollo específico para cada plataforma ya que el código no es reutilizable. Aunque ha día de hoy, este sigue siendo el método más empleado por los desarrolladores.
Aplicaciones Web. El segundo tipo de aplicaciones móviles son las aplicaciones web. Este tipo de aplicaciones se caracterizan por ser multiplataforma, lo que posibilita un único desarrollo, motivo por el que algunas empresas van abandonando el costoso modelo de un equipo de producción por sistema operativo para dedicarse en exclusiva a este tipo de aplicación. Existen varios framework como Sencha Touch[24] o JQuery
Mobile[49] que haciendo uso del diseño responsive permite que las aplicaciones sean adaptables a distintos tipos de pantalla(Figura 3.4).
Figura 3.4. Aplicaciones web: Sencha y jQuery
Las aplicaciones web no son compiladas como aplicaciones nativas, sino que son construidas través de frameworks que generan código web o incluso usando código HTML normal. Tienen la problemática de contar con un acceso limitado a las funcionalidades de los dispositivos, motivo por el que la mayoría de las empresas aún continúan con el sistema de tres equipos de producción (web, Android e iOs), para ofrecer una mayor experiencia a los usuarios.
Aplicaciones Híbridas. El último tipo de aplicaciones móviles son las que están construidas con la tecnología web (HTML5), pero pretenden comportarse como aplicaciones nativas, facilitando de ese modo el acceso a elementos del hardware que las aplicaciones web no pueden, aunque manteniendo la reusabilidad del código para diferentes sistemas. Un ejemplo de este tipo es Ionic[26] o PhoneGap[25](Figura 3.5).
Figura 3.5. Aplicaciones híbridas: Ionic y PhoneGap
Las aplicaciones híbridas usan el código web y lo compilan como si fueran una aplicación nativa. PhoneGap crea un proyecto nativo para cada plataforma (aunque Ionic ya lo incluye dentro), en la que cada aplicación es una pantalla web que carga el contenido de la web que se le indique. Además de contar con una API para acceder a las características del dispositivo desde la web (como acceder al acelerómetro a través de una
librería JavaScript). Aunque desafortunadamente posee un alcance limitado a la hora de acceder a todas las opciones del teléfono, causando una experiencia algo menor que las nativas.
Tras estudiar los distintos tipos de aplicaciones que existen, queda claro que las aplicaciones nativas son las que mejor rendimiento y experiencia ofrecen. Pero suponen un coste económico y de tiempo tener que implementar la misma aplicación por cada sistema. Es evidente que la tendencia de las nuevas tecnologías es buscar superar esta barrera, pero a día de hoy suponen unas desventajas de cara a la funcionalidad, que dependerá de los desarrolladores y de si se busca una mejor experiencia y disfrute por parte del usuario frente al ahorro multiplataforma.
3.2. Proyectos Técnicos
A continuación, se presentan otros proyectos relacionados con el aquí expuesto que sirvieron de inspiración y orientación para el desarrollo. Se tratan de proyectos similares que nos ofrecieron una idea de cómo diseñar los perfiles de los usuarios o gestionar los libros subidos para poder descargarlos.
3.2.1. YouTube
La aplicación que ha supuesto la principal inspiración para YouBook ha sido obviamente YouTube[7] (Figura 3.6). La idea primaria en la fase conceptual del TFM la podríamos resumir en “Un YouTube de libros”. Un sitio web dedicado a compartir libros entre los aficionados a la literatura. Además, YouTube cuenta también con una aplicación Android que realiza peticiones a su servidor para permitir realizar las mismas acciones en el dispositivo móvil.
Figura 3.6. YouTube
En lugar de vídeos, los clientes de la aplicación subirán libros. Pero elementos como poder darle “like” a un libro y que éste se añada a una lista de Libros Favoritos,
o que los libros añadidos aparezcan en una lista de Libros Subidos y que dichas listas aparezcan en el perfil del usuario, fueron inspirados directamente por el sistema de listas de YouTube (Figura 3.7). Así como las flechas laterales en la lista para poder navegar por los elementos subidos (mostrándolos de cuatro en cuatro).
Figura 3.7. Listas en YouTube
Y al igual que bajo los vídeos subidos aparece la foto del perfil del usuario que lo ha subido, una lista con los comentarios y un enlace a sus cuentas, en YouBook haremos lo mismo con los libros.
3.2.2. Bubok
Una aplicación muy interesante que ha podido influir en la temática literaria y que busca ayudar a los escritores novatos a obtener réditos económicos de su trabajo, ha sido la página web de Bubok[8]. Bubok(Figura 3.8) es un sitio web que permite a los usuarios publicar libros en formato digital y los dueños del portal se encargan de vender los libros en formato físico.
Para rentabilizar las obras, los escritores pueden calcular el precio de sus libros en formato físico, que varía en función del número de páginas, el tamaño del libro, si es a color, etcétera. La calculadora dará al usuario el precio mínimo OBLIGADO al que ha de vender su obra (Figura 3.9).
Figura 3.9. Calculadora de Bubok
Luego, sobre la base de los costos mínimos, se decide el precio de venta final en función de los ingresos deseados por venta (Figura 3.10).
Figura 3.10. Precio de Venta en Bubok
En la web podemos ver los libros que ha subido un autor y comprarlos, ya sea en formato físico o digital.
3.2.3. GitBook
La última web similar sería GitBook[9], un portal basado en el software de control de versiones de GIT, pero para libros (Figura 3.11).
Figura 3.11. GitBook
GitBook permite la publicación de libros online para compartir entre los usuarios. Los autores registrados en esta web pueden subir libros y gestionar una serie de permisos a la hora de compartirlo, ya sea de lectura y escritura. El documento lo pueden subir de carácter público (cualquier usuario puede leerlo) o privado (restringido a quien el autor decida) y no es necesario que los lectores estén registrados para ser invitados a leer el archivo.
Una característica específica de la web, al estar basada en GIT, es el control de versiones y la edición del documento online. Presenta un editor de texto al creador para poder modificar el documento de forma online (Figura 3.12), ahorrando de ese modo tener que volver a subirlo cada vez que desee hacer una modificación.
3.3. Estudio de la Competencia
Una vez presentado los proyectos similares que supusieron una inspiración para YouBook, vamos a determinar qué ventajas y desventajas tiene nuestra aplicación web y en concreto la versión Android en el mercado en general de las apps.
3.3.1. En la Web
YouBook podría definirse como un híbrido entre YouTube y Bubok, conformado por los elementos de la primera dedicados a la temática de la segunda. Con respecto a YouTube no existe gran competencia, ya que se centra en compartir libros. Y en GitBook, con el tiempo ha ido orientándose más a documentos dedicados a la docencia, mientras que YouBook permite la publicación de cualquier elemento en formato PDF (ya sea libros docentes o cómics como veremos más adelante), así como las funciones de gestión de usuarios, listas de libros, posibilidad de hacer donaciones, etc. Aunque podemos tener una pequeña desventaja frente a GitBook, que es no ofrecer la posibilidad de editar los libros online, pero lo más probable es que nuestros usuarios utilicen YouBook para compartir novelas, cómics, libros de historia, filosofía o economía, por lo que no consideramos que GitBook pueda arrebatarnos nuestro nicho de mercado.
La principal competencia vendría por el lado de Bubok. Ya que comparte el principio de lanzadera de escritores novatos que buscan darse a conocer y obtener ingresos monetarios con ello. Pero existe una gran ventaja de nuestra web, nosotros permitimos la posibilidad de que los lectores hagan donaciones a los escritores. Al no existir cantidad mínima al hacer el pago, sino que el usuario decide cuánto donar en función de sus posibilidades, permite que el autor obtenga unos ingresos directos sin intermediarios (a excepción de PayPal que se lleva un pequeño porcentaje sobre las donaciones). De esta forma, los lectores con una situación económica más humilde que deseen apoyar a su escritor favorito para que continúe publicando obras, podrán hacer una aportación sin necesidad de desembolsar una gran cantidad.
Ya vimos en las Figuras 3.4 y 3.5 que el único ingreso que puede obtener el escritor es mediante la venta de libros cuyo precio mínimo NO DECIDE ÉL. En Bubok es la web quien pone unos precios elevadísimos, ya que los dueños del portal incluyen
en el precio su comisión por las gestiones. En el ejemplo de las Figuras 3.4 y 3.5 la web calculó que su libro tenía un coste mínimo de 29,5€, es decir, si decidía venderlo a ese precio no obtendría ningún ingreso (la web sí, por supuesto). Si decidía aumentar el precio para tener unos ingresos de 4€, el precio del libro se disparaba a 35€. ¿Y quién está dispuesto a pagar 35€ por el libro de alguien que no es conocido? Y aunque tan solo decidiese venderlo por 30€ obteniendo de ese modo unos escasos ingresos fijos de cincuenta céntimos, 30 euros seguiría siendo un precio elevado para un libro.
En cambio YouBook ofrece un sistema de financiación más humilde donde cada usuario puede hacer pequeñas donaciones directas al creador (0,5€, 1€, 2€, 3€, etc.) en lugar de desembolsar casi 30€ de los cuales tan solo va una irrisoria parte al escritor (un modelo, por cierto, que las grandes editoriales también emplean). Por lo que YouBook ofrece una plataforma que conecta directamente al lector con el escritor.
Y a nivel técnico, YouBook ofrece elementos de gestión de libros para subirlos y editarlos más intuitivo y sencillo que el complicado sistema de sucesivos formularios de Bubok, así como una mayor velocidad de respuesta gracias a su sencilla interfaz inspirada en la de YouTube (aunque este apartado es subjetivo, ya que algunos usuarios preferirán la interfaz cargada de elementos de Bubok). Además de contar con una versión Android que permite leer los libros online desde cualquier lugar, y compartir los libros e información de los usuarios desde el ordenador y el teléfono.
3.3.2. Mercado de las Apps
Una de las ventajas con la que cuenta la app de YouBook, es que no existen muchas aplicaciones dedicadas a compartir libros, la gran mayoría son apps dedicadas a abrir archivos almacenados en el dispositivo y presentarlos. La mayoría están pensadas para gestionar la librería del usuario o para conocer libros, pero nuestra app presenta un tipo de red social para compartir libros con acciones como dar like o comentar una obra, que la mayoría del resto de aplicaciones no posee. Y lo mismo sucede al usar un servidor que comparte la información tanto en web como en el teléfono, ya que el 99% de las apps de Android no cuentan con versión web.
4.
Objetivos
Una vez establecida la necesidad de un proyecto para facilitar la rentabilización de nuevos escritores y el estado del arte con todo el estudio previo de los conceptos teóricos y los proyectos inspiradores que seguiremos en el desarrollo, debemos tener claros unos objetivos mínimos a alcanzar con este trabajo, tanto básicos como avanzados, antes de pasar a la metodología que emplearemos.
Los objetivos Básicos:
Registrar Usuarios y poder subir los libros en formato PDF. Creación de un servidor que gestione los libros subidos. Persistencia y Base de Datos de usuarios.
Poder descargar dichos libros.
Listar los libros subidos y filtrarlos en una búsqueda.
Poder editar libros y perfiles, y visualizar los perfiles de otros usuarios para ver sus libros subidos.
Aplicación Android cliente que acceda a la información del servidor mediante peticiones REST (Servicio RESTFul).
Los objetivos Avanzados:
Poder dar a Me gusta a los libros.
Una lista de los libros a los que se le ha dado Me gusta. Comentar un libro.
Añadir la posibilidad de micropagos.
Realizar todas las acciones del servidor en la app: crear, editar, dar like, comentar, eliminar, visualizar, registrar, identificarse, etc. Siendo capaces de enviar imágenes y PDFs por la red.
Como objetivos personales, los podemos resumir en adquirir los conocimientos necesarios para implementar la enriquecedora idea de crear una aplicación de apoyo a esos nuevos autores para que puedan alcanzar sus sueños.
5.
Metodología
A continuación, vamos a describir la metodología seguida para la implementación de nuestro proyecto: herramientas, tecnologías y técnicas que se utilizarán para el desarrollo de este trabajo de fin de máster. Comenzando por los bocetos de los mockups iniciales, pasando por el diseño de la base de datos y presentando los servicios REST básicos de nuestra aplicación. Haremos un seguimiento de los pasos realizados desde la fase conceptual del diseño de interfaces, pasando por establecer las entidades que participarán y las acciones que podrán realizar, hasta detallar las tecnologías y frameworks que hemos empleado.
5.1. Diseño
En primer lugar debía establecerse las diferentes vistas por las que navegaremos en nuestra aplicación, haciendo uso del diseñador de interfaces online Fluid[2], elaboramos los mockups iniciales de las pestañas del programa. En la siguiente imagen (Figura 5.1) podemos apreciar el diagrama de flujo entre los diferentes prototipos de interfaces de YouBook con los distintos casos de uso.
A continuación, vamos a detallar más en profundidad el flujo de navegación entre las vistas, así como las acciones que pueden realizarse en cada una de ellas.
Cuando se entra en la aplicación, la primera pantalla que aparecerá será una lista con el catálogo de todos los libros publicados (Figura 5.2), ordenados por fecha del más reciente al último. Aunque el usuario no esté registrado, podrá realizar varias acciones como ver la información de los libros o usar el buscador para filtrar las obras que desea leer.
Figura 5.2. Vista Principal
Si el usuario escribe el nombre de un libro, le llevará a otra vista donde se mostrarán únicamente los libros filtrados. Aun sin estar identificado, podrá consultar la información del libro donde verá a qué género pertenece, el resumen, etcétera. Lo más importante a destacar, es que podrá descargar el libro en su terminal para poder leerlo (Figura 5.3). Además, podrá examinar el perfil del autor y ver otros libros que haya subido o a los que haya dicho que le gustan y ver su información y/o descargarlos.
Figura 5.3. Acciones Básicas sin Necesidad de Identificarse
Si el usuario inicia sesión, podrá realizar más acciones (Figura 5.4). A parte de poder editar su perfil, contará con la opción de evaluar un libro comentándolo en la caja de comentarios o dándole a “Me Gusta”, lo que lo añadirá a una lista personal de libros favoritos.
El usuario identificado podrá subir sus libros que aparecerán en su perfil en la lista de obras subidas (Figura 5.5). Dicho libro aparecerá en la pestaña principal y otros usuarios podrán descargarlos. Al subir el libro rellenará la información básica, como el propio archivo PDF, la portada del libro, el título, número de páginas, etcétera.
Figura 5.5. Subir un Libro
Si el usuario visualiza sus libros subidos, le aparecerá la opción de editarlos por si desea cambiar la portada u otra información, o eliminarlo (Figura 5.6).
5.2. UML
Una vez definidas las vistas principales por las que navegaremos, debemos identificar las entidades que intervienen en nuestra aplicación mediante un Diagrama UML de la base de datos (Figura 5.7). Contamos con los usuarios registrados y con los libros que éstos suben. También es necesario representar el modelo “comentario” para almacenar las valoraciones de los usuarios en la BD, estos estarán identificados por su id y apuntarán al usuario que comentó y al libro que se comentó.
Figura 5.7. Diagrama UML de la BD
Hemos detallado las acciones que los usuarios registrados pueden realizar, el UML también identifica esas acciones. Los usuarios pueden subir todos los libros que deseen, los libros están identificados por su id, que va incrementando por cada archivo subido, es decir, un libro, aunque tenga la misma información (título, portada, resumen...) contarán con ids distintos. Los usuarios podrán dar “Me Gusta” a todos los libros que quieran, eso luego se materializará en una nueva tabla cuya clave primaria estará compuesta por dos claves ajenas que apuntarán al id del usuario y del libro. Los usuarios tendrán un email y password para iniciar sesión y un booleano que podrá identificarlos como administradores para poder eliminar ciertos libros inadecuados.
5.3. Tecnologías
A continuación vamos a enumerar y explicar las tecnologías utilizadas para desarrollar este Proyecto Final de Máster.
5.3.1. Laravel
Lo primera tecnología que vamos a detallar es, junto con el sistema Android en la aplicación cliente, la más importante y la que nos ofrece el entorno de trabajo para implementar nuestro servidor web así como sus vistas y la gestión de la base de datos: Laravel (versión 5.4) [3].
Figura 5.8. Icono Laravel
Laravel es un framework que ofrece grandes ventajas para el desarrollo de aplicaciones web en PHP. Facilita el desarrollo de tareas como la autentificación, la gestión de sesiones o el enrutamiento, obteniendo una aplicación web con un código sencillo y limpio.
Para las vistas hace uso de un sistema de plantillas muy potente llamado Blade[7]. Son ficheros PHP (con extensión nombre.blade.php) que combina código en PHP para las operaciones de datos con HTML, Boostrap, CSS o JavaScript, lo que nos permitirá crear vistas dinámicas, ricas en elementos visuales y con sencillas sentencias en PHP para el acceso a la base de datos. Las plantillas Blade utilizan la caché para dar mayor velocidad al código que conforma la vista.
Para la gestión de la base de datos y la estructura de las tablas cuenta con el sistema de Migraciones[29]. Las migraciones son un sistema de control de versiones de la BD de nuestro proyecto. A lo largo del proceso de producción, pueden surgir nuevas entidades a integrar en la BD o añadir nuevos campos a las tablas ya existentes, para realizar estas modificaciones, Laravel nos ofrece las migraciones (que
son archivos .php) con la descripción de la tabla que queramos crear o la tabla que queramos añadir. Además, podemos modificar una columna ya existente, si por ejemplo queremos que tenga un valor por defecto que no habíamos contemplado al crearlo. Las migraciones también pueden deshacerse y regresar las tablas a su estado inicial. En la siguiente imagen (Figura 5.9) podemos ver el ejemplo del cuerpo de una migración para crear una tabla (en este caso la tabla “Users”). Para hacer efectiva esta migración y que se cree la tabla correspondiente de la base de datos simplemente debemos ejecutarla.
Figura 5.9. Ejemplo de una Migración
Para trabajar con las tablas creadas con las migraciones, Laravel integra el sistema de mapeado de datos Eloquent ORM[28]. Se trata de un mapeo objeto-relacional (ORM o Object-Relational Mapping) para convertir datos entre un lenguaje de programación y una base de datos. Podemos acceder a la BD y a sus campos como
si programásemos orientados a objetos, pudiendo insertar, modificar o eliminar. Cada tabla será representada por un Modelo (el cual será un clase en un fichero .php) que nos permitirá interactuar desde el código con la Base de Datos.
Podemos incluir librerías o paquetes externos si queremos añadir funcionalidad a nuestro proyecto (como un sistema de notificaciones) para ahorrar tiempo de programación. Y cuenta con un intérprete de línea comandos llamado Artisan, que nos permitirá desde el terminal (Figura 5.10) la creación y ejecución de migraciones, la creación de modelos, controladores, rutas, etc. sin necesidad de hacerlo nosotros. Incluso cuenta con un comando para crear semillas de inicialización de la base de datos para contar con información desde el comienzo del desarrollo para las pruebas.
Figura 5.10. Ejemplo de Comandos de Artisan
Para la correcta separación de los elementos del proyecto, Laravel utiliza el patrón de arquitectura web MVC (Modelo-Vista-Controlador) para modular el código, separando los datos y la lógica de negocio, de la interfaz que visualiza el usuario y los manejadores de eventos y comunicación. En la siguiente imagen (Figura 5.11) puede contemplarse como este patrón separa los conceptos de la aplicación.
Figura 5.11. Patrón MVC[30]
Entran en juego tres elementos: El modelo, la vista y el controlador. El modelo representa la información del sistema, se encarga de gestionar los accesos, consultas y actualizaciones de los datos. El controlador se encarga de responder a los eventos del usuario haciendo peticiones de acceso o manipulación al modelo, prepara los datos y se los envía a la vista. La vista presenta al usuario los datos del modelo que le han llegado del controlador. El usuario interactúa con la vista para realizar otras peticiones que serán recibidas por el controlador para manipular los datos del modelo.
Funcionamiento Básico
El funcionamiento básico de Laravel consiste en responder a las peticiones que el usuario realiza a las URLs de nuestro sitio web. Como puede verse en el siguiente esquema (Figura 5.12), todas las rutas de nuestra página se almacenarán en el archivo routes/web.php. Cuando el usuario realice peticiones a alguna URL, se comprobará si existe dicha URL en el archivo index.php, donde se habrán cargado previamente. Si la URL es válida (de no serlo daría al usuario el error 404 “página no encontrada”) se llevará a cabo la acción deseada. Las URLs están asignadas a un método gestionado por un controlador. El método del controlador vinculado a la ruta solicitada accederá a la base de datos (si lo requiriese) a través de modelo (para obtener un elemento, añadir, borrar o actualizar). Una vez que el controlador tiene la información, se la pasa a la vista, la cual se encargará de mostrársela al usuario.
Figura 5.12. Esquema del Funcionamiento de Laravel
Por lo tanto, hemos de definir las rutas (también podríamos llamarlas acciones) a las que el usuario tiene acceso y el controlador cuyo método estará asignado a esa ruta. En el apartado “Rutas de YouBook” mostraremos una tabla con las rutas de la aplicación.
Instalación mediante Composer
Para instalar Laravel, utilizaremos el gestor de dependencias de PHP llamado Composer[10]. Composer instalará en nuestro ordenador todas las librerías y dependencias que nuestro proyecto Laravel necesite.
Figura 5.13. Icono de Composer
En la raíz de nuestro servidor web (ver siguiente sección, Servidor XAMPP), donde alojaremos el proyecto, ejecutaremos el comando de Composer para crear la aplicación con la última versión de Laravel con todas sus librerías y dependencias.
5.3.2. Servidor XAMPP
Como Servidor Web utilizaremos XAMPP[12], una distribución libre de Apache donde alojaremos el proyecto Laravel para que las páginas web sean interpretadas dinámicamente. Su nombre proviene por las funciones que incorpora, de los acrónimos X (existe una versión para cada sistema operativo), Apache (cuenta con un servidor Apache), MariaBD o MySQL (como sistema de gestión de base de datos), PHP y Perl (al poseer un intérprete para estos lenguajes).
Es importante entender que los navegadores como Firefox o Google Chrome no interpretan código PHP, como sí hacen con HTML o JavaScript. PHP es código que se ejecuta en servidor y nunca llega a cliente, por lo que necesitamos un servidor web que lo ejecute y envíe la vista resultante.
Figura 5.14. XAMPP
Utilizaremos XAMPP en la fase de producción de YouBook como Servidor Web. Por lo que, durante la etapa de desarrollo, trabajaremos “en local”. Para utilizar las características de XAMPP contamos con un panel de control para activarlas (Figura 5.15), aunque con ejecutar el servidor Apache y el gestor MySQL es suficiente.
En la instalación del paquete de XAMPP, también viene integrado un panel de control para la gestión de la Base de Datos del servidor llamado PHPMyAdmin (Figura 5.16), al cual se accede en local escribiendo en el navegador la ruta “http://localhost/phpmyadmin”.
Figura 5.16. Panel de Control de PHPMyAdmin
Aquí crearemos la Base de Datos que utilizaremos en YouBook, y luego, en la propiedades de la base de datos del proyecto, le indicaremos qué BD es la que debe conectarse. PHPMyAdmin es muy útil durante la fase de desarrollo, pues podemos visualizar en las tablas creadas los valores que se introducen (como cuando registramos un usuario o añadimos un libro) (Figura 5.17).
5.3.3. HTML5, CSS y Boostrap
Como lenguajes de programación Web, además de utilizar PHP para el acceso y la gestión de los datos, hemos utilizado HTML[31] para el diseño de las vistas para el cuerpo de las plantillas Blade, CSS3[32] para los estilos visuales como los botones y Boostrap[16] como framework para el diseño Responsive. Y como editor de texto para programar con estos lenguajes hemos utilizado Sublime Text[35].
Figura 5.18. HTML5, CSS y Boostrap
Para alcanzar el diseño adaptativo Boostrap utiliza un sistema de rejillas donde podemos definir tantas filas como queramos y dentro de cada fila podemos repartir el espacio que ocupan los elementos en 12 posibles columnas. Es decir, si un elemento ocupa 12 columnas significa que ocupa el 100% de la fila; si un elemento ocupa 6 columnas y el otro el resto de las 6 columnas, significa que cada uno ocupa el 50% del espacio. Y si un elemento excede el espacio de 12 columnas, pasará a la siguiente fila.
Para ajustar dinámicamente el espacio (número de columnas) que un elemento ocupa según el tamaño de pantalla, Boostrap utiliza clases CSS para definir los tamaños de pantalla: col-xs para tamaños extra pequeños; col-sm para tamaños pequeños; col-md para tamaños medianos; y col-lg para tamaños grandes. Definiremos el espacio de un elemento según el tamaño de pantalla que lo visualice; por ejemplo, podemos decir que un botón ocupe 6 columnas si lo visualiza una pantalla de tamaño mediano (como una tablet) y que pase a ocupar 3 columnas si está siendo visualizado en una pantalla de tamaño pequeño (como un teléfono móvil).
5.3.4. IDE
De todos los tipos de aplicaciones móviles que analizamos en el marco teórico del estado del arte, finalmente optamos por una aplicación nativa tipo Android para crear la aplicación cliente. Para programar la aplicación cliente nativa utilizaremos Android Studio[13] (versión 2.3.3), que nos ofrece un emulador para simular el funcionamiento de una dispositivo móvil real. Como librerías para programar usaremos el SDK (kit de desarrollo de software o Software Development Kit) de Android para toda la gestión de interfaces y peticiones al servidor.
Figura 5.19. Android Studio
5.3.5. Control de Versiones
Para el control de versiones se ha utilizado Git[6]. Para el proyecto YouBook contamos con dos repositorios: el repositorio del proyecto Laravel y el repositorio del proyecto Android. Para el alojamiento de los repositorios usamos BitBucket [33], el cual cuenta con una interfaz Web que nos permite configurar el repositorio, explorar el código, así como visualizar los commits realizados (Figura 5.20).
5.4. Rutas de YouBook
Como ya comentamos en el apartado “Funcionamiento básico de Laravel”, necesitamos definir las rutas de nuestro sitio web (Tabla 5.1) y los controladores cuyos métodos están vinculado a dichas rutas. Las rutas las podemos separar en dos grupos, las que tienen relación con los libros y las que tienen relación con los usuarios. Por lo que tendremos dos controladores.
Laravel también permite añadir filtros (middleware) a las rutas, como por ejemplo para filtrar o proteger las rutas que requieren autentificación ('middleware' => 'auth'). Rutas como la edición de un libro, un perfil o poder darle like a una obra publicada solicitará al usuario que se haya logueado. Laravel ya incorpora el modelo Users y un controlador asociado encargado del registro y la autenticación.
Método RUTA Acción Filtro
GET / Redirigir al listado de Libros
GET /catalog Listar Libros
GET /catalog/show/{id} Información Libro
GET /catalog/result/{name} Vista Resultado de la Búsqueda POST /catalog/result Resultado de la Búsqueda
PUT /catalog/download/{id} Descargar Libro PUT /catalog/readonline/{id} Leer Libro Online
GET /profile/show/{id} Información Usuario
POST /catalog/comment{id} Comentar Libro auth
GET /catalog/create Vista Crear Libro auth
POST /catalog/create{id} Crear Libro auth
DELETE /catalog/delete/{id} Eliminar Libro auth
GET /catalog/edit/{id} Vista Editar Libro auth
PUT /catalog/edit/{id} Editar Libro auth
PUT /catalog/like/{id} Dar Megusta a un Libro auth
GET /profile/edit/{id} Vista Editar Perfil auth
PUT /profile/edit/{id} Editar Perfil auth
DELETE /profile/delete/{id} Eliminar Cuenta auth
En esta tabla se ha añadido además una primera columna para indicar el tipo de petición HTTP (GET, POST, PUT o DELETE) que espera cada ruta. Este tipo nos permite diferenciar para una misma ruta la acción a realizar. Por ejemplo, al acceder a la ruta “/catalog/edit/{id}” por GET se devolverá la vista para editar un libro, mientras que si accedemos a la misma ruta por PUT nos permitirá modificar los datos de dicho libro. Este tipo de acciones nos permiten asociar las operaciones que podemos realizar con un recurso, y son propias de la arquitectura REST que veremos a continuación.
5.5. API RESTFul
Laravel también incorpora un tipo especial de controlador llamado Resource Controller. Este tipo de controlador también es llamado Controlador RESTFul, el cual se encarga de gestionar las peticiones REST a las rutas de los recursos del servidor a los que el cliente quiera acceder. Estas rutas también podemos restringirlas o filtrarlas con un middelware que requiera autentificación.
Para el servidor vamos a definir una API mediante un controlador RESTFul que ofrecerá el Servicio Web a la aplicación Android. El servidor brindará una serie de rutas para acceder a sus servicios según el método solicitado, para así poder realizar las mismas acciones que se realizan desde la web pero desde el teléfono (Tabla 5.2).
Método RUTA Acción Filtro
GET /v1/catalog Listar Libros
GET /v1/catalog/show/{id} Información Libro
POST /v1/catalog Crear Libro auth
PUT /v1/catalog/{id} Actualizar Libro auth
DELETE /v1/catalog/{id} Eliminar Libro auth
GET /v1/profile/{id} Información Usuario
GET /v1/profile Registar Usuario
POST /v1/profile/edit/{id} Editar Perfil auth
DELETE /v1/profile/delete/{id} Eliminar Cuenta auth
GET /v1/comments/{id} Obtener Comentarios de un Libro
POST /v1/comments/{id} Comentar un Libro auth
PUT /v1/like/{id} Dar MeGusta a un Libro auth
GET /v1/subidos/{id} Libros Subidos de un Usuario GET /v1/favoritos/{id} Libros Favoritos de un Usuario
Tabla 5.2. API RESTFul
Desde el dispositivo móvil el cliente hará peticiones al servidor a las rutas de la API. Estas rutas no devolverán vistas si no respuestas en formato JSON (un formato de texto para el intercambio de datos[35]) con la información solicitada que la app procesará y presentará al usuario de la aplicación.
A estas rutas se les ha añadido el prefijo “v1”, por lo que para acceder a las mismas se tendrá que usar la URL, por ejemplo “/api/v1/profile”. Esto nos permite ir creando versiones de la API (v2, v3, etc.) y a la vez mantener las versiones antiguas para que los dispositivos que todavía no se hayan actualizado puedan seguir funcionando.
5.6. Arquitectura
Una vez explicados los conceptos teóricos que intervienen en nuestro proyecto, la metodología que seguiremos, y las tecnologías empleadas, ya podemos presentar la arquitectura que tendrá YouBook (Figura 5.21).
Figura 5.21. Arquitectura YouBook
Contamos con dos tipos de Front-End, que serán la aplicación cliente y la página web que se visualizará desde el navegador para acceder a los datos del servidor. Contamos con un Back-End que gestionará las acciones del servidor de YouBook. El usuario podrá acceder a nuestro servidor de dos formas. La primera será a través del navegador (ya sea desde un computador o un dispositivo móvil), solicitará las rutas de nuestra web que serán procesadas por el controlador accediendo al modelo almacenado en la BD y devolverá la vista con la plantilla Blade que, haciendo uso del diseño responsive, se ajustará al tamaño de pantalla del dispositivo. Y por el otro lado, contaremos con una App nativa de Android que accederá a los servicios web de nuestro servidor a través de de la API con peticiones REST en formato JSON. Y procesará la respuesta en el mismo formato para presentarlo al usuario.
6.
Desarrollo
En esta sección vamos a detallar el desarrollo del proyecto: la implementación realizada y los apartados técnicos existentes. Comenzaremos explicando la aplicación web de Laravel, los detalles del acceso a los datos para mostrarlos en las vistas, así como todas las funcionalidades que ofrece al usuario. Y continuaremos con la app cliente, en la que describiremos los servicios del servidor a los que tiene acceso para permitir al usuario realizar las mismas acciones que en la web y cómo acceder a ellos.
6.1. Implementación de la Aplicación Web
Comenzamos con la descripción del desarrollo de la web de YouBook (Front-End para la gestión de libros y usuarios). Una vez hemos instalado el proyecto Laravel en nuestro servidor XAMPP utilizando Composer, podemos corroborar que todo ha salido correctamente escribiendo en el navegador la url: “http://localhost/<nombre del proyecto>/public/”, en nuestro caso sería “http://localhost/youbook/public/” (por supuesto hemos de tener ejecutando los servicios de XAMPP indicados en la Figura 5.15). Esto nos abrirá en el navegador una página por defecto (Figura 6.1):
Figura 6.1. Página por defecto de Laravel
Una vez hemos comprobado que todo funciona correctamente, ya podemos empezar a programar nuestro sitio web. Pero antes de entrar en la lógica, vamos a analizar cómo Laravel separa el código en su estructura de directorios para entender en que parte se aloja cada fragmento de la web.
6.1.1. Directorios de Laravel
Al instalarse, Laravel genera una estructura de carpetas para organizar el código. Es necesario saber en qué carpeta se aloja cada elemento, ya que el compilador los buscará en el directorio que le corresponda. En la raíz podemos encontrar:
•
app -Aquí se aloja el código principal, dividido a su vez en subcarpetas:◦ Http/Controllers –Aquí se almacenarán los controladores que interaccionarán con el modelo y las vistas.
◦ Http/Middelware -Aquí definiremos los filtros a las rutas.
◦ En la raíz de “app” se alojarán los modelos. En nuestro caso tendremos los modelos User, Book y Comment.
•
config –Aquí se localizan los archivos de configuración de la aplicación.•
database -Aquí se almacena todo lo relacionado con la BD del proyecto.◦ migrations -Las migraciones que crearemos a lo largo del desarrollo. ◦ seeds -Aquí se almacenan las semillas con los datos de inicialización
de la BD.
•
vendor -Aquí se alojan las dependencias y librerías de Laravel.•
storage -Aquí se guarda la información de la ejecución de la web (sesiones, logs, etc.), así como la caché y la compilación de las vistas.◦ logs -Esta carpeta es muy útil, ya que aquí se almacenan los logs con la información y errores encontrados en la ejecución.
•
public -La única carpeta pública de nuestro servidor, aquí se procesan las peticiones a la web ya que contiene:◦ index.php -Inicializa la ejecución de Laravel y almacenará (automáticamente) las rutas definidas.
◦ css -Archivos de estilo css. ◦ js -Archivos JavaScript.
◦ En public almacenaremos también las imágenes y archivos que necesite la web. En nuestro caso crearemos una carpeta “portadas” para guardar las caratulas de los libros, “pdf” para los pdfs de los libros y “perfiles” para las fotos de los usuarios.
•
resources -Este directorio contiene:◦ views -Aquí se almacenan las vistas de la web.
◦ lang -Este directorio se utiliza para almacenar las cadenas de texto de la web para que puedan traducir.
•
routes -Aquí se guardarán las rutas de la web:◦ web.php -Aquí definimos las URLs de la web y las enlazaremos a un método de un controlador.
◦ api.php -Aquí definimos las rutas del servidor a las que las aplicaciones externas (clientes) pueden acceder.
•
.env -Este fichero se encuentra en la raíz del proyecto. Se utiliza para almacenar valores de configuración de la máquina donde se ejecuta.Hay más, pero estas serían las carpetas más importantes de un proyecto Laravel.
6.1.2. Definir las rutas
Lo primero que debería hacerse en cualquier proyecto Laravel es definir las rutas de nuestra web. En el apartado 5.4 de la metodología mostramos todas las rutas de la web (Tabla 5.1). Por su puesto, al comienzo del desarrollo tenemos una idea básica de las rutas que aparecerán (para listar, para subir un libro, para editar, etc.), pero conforme avanzamos en el desarrollo veremos que necesitamos más rutas de las planeadas en un inicio. Esas rutas, como ya dijimos en el funcionamiento básico de Laravel, debemos enlazarlas a un controlador (alojado en la carpeta app/HTTP/Controllers).
Una vez tenemos decididas las rutas por las que el usuario podrá navegar, ya podemos diseñar las vistas de la web.
6.1.3. Definir el Layout Principal
YouBook, al igual que muchas otras web, contará con una barra de navegación (un navbar) que estará presente en todas las vistas, y ofrecerá varias funciones como iniciar sesión o realizar una búsqueda filtrada de un libro por su nombre, entre otras acciones (Figura 6.2).
Figura 6.2. Barra de Navegación de YouBook
Ya podemos diseñar la plantilla Blade de la barra de navegación. Haciendo uso de los estilos de CSS y de la librería responsive Bootstrap definimos el tipo de barra de navegación que deseamos: el color de fondo, el título, el icono (Figura 2.1), etc.
Para que todas las vistas tengan un estilo visual homogéneo y que la barra de navegación este presente en todas las vistas como estilo base, necesitamos definir un layout principal (que es otra plantilla Blade). En este layout ordenaremos los elementos que aparecerán en la vista. Es decir, primero le indicamos que cargue la barra de navegación con la sentencia @include(barra de navegación) y a continuación que muestre el contenido de la vista con @yield('content'). Posteriormente, en las futuras vistas que implementaremos, tan solo debemos cargar el layout como estilo base con la sentencia @extends(layout principal), esto hará que cargue la barra de navegación en todas las vistas. Y dentro de la sentencia @section('content') ... @stop escribiremos el código HTML de la vista.
Pero para definir el layout principal y su estilo base debemos descargar la librería de Boostrap y la alojarla en el directorio public/assets. Y en la plantilla del layout debemos incluir los recursos CSS y javascript de la carpeta que hemos descargado de Boostrap.
De esta forma logramos que la barra de navegación esté presente en todas las vistas que diseñaremos a continuación.
6.1.4. Vista Principal: Listado de Libros
Antes de explicar las funcionalidades de la barra de navegación, vamos a presentar la vista principal de la página (Figura 6.3).
Figura 6.3. Vista Principal
Cuando entramos en la web (dijimos que la ruta para acceder era “http://localhost/youbook/public/”) nos aparecerá la vista de “home”. Esta URL sería la ruta raíz, y para definirla en Laravel simplemente tenemos que indicar la ruta '/'. Debemos crear un controlador (por ejemplo HomeController) que se encargue de procesar dicha ruta. En nuestro caso, haremos que el controlador redirija la ruta raíz de la web '/' a la ruta '/catalog', que mostrará el listado de los libros subidos.
La ruta '/catalog' será gestionada por otro controlador (CatalogController, que será quien se encargue de las vistas relacionadas con los libros). El controlador hará uso del modelo Book para acceder a la tabla a través de una query de ORM Eloquent y obtendrá todo el catálogo de libros subidos ordenados por la fecha de publicación. Este tipo de consulta devolverá un array de datos de PHP que le enviaremos a la vista del listado.
Al principio del desarrollo no contamos con usuarios registrados que hayan publicado sus obras, por lo que necesitaremos inicializar la BD. Para esto utilizamos el comando artisan que creará un DataBaseSeeder que no será más que un archivo PHP donde escribiremos los datos con los que trabajaremos al principio.
La vista del listado recorrerá el array de libros y los mostrará en la página. En este bucle utilizaremos el sistema de rejillas de Boostrap para adaptar la vista según el tamaño de pantalla para indicar cuánto ocupa un libro: Para pantallas grandes
diremos que cada libro ocupe 3 columnas. Es decir, que una fila mostrará 4 libros (3+3+3+3 = 12) como podía apreciarse en la Figura 6.3 anterior.
Para tamaños medianos, un libro ocupará 4 columnas, es decir, una fila contendrá 3 libros (Figura 6.4)
Figura 6.4. Vista Principal en tamaño Mediano
Para tamaños de pantalla pequeños (Figura 6.5) cada libro ocupará 6 columnas (el 50% de una fila).
Y para tamaños extra pequeños un libro ocupará el 100% de la fila (Figura 6.6):
Figura 6.6. Vista Principal en tamaño Extra Pequeño
Cuando recorremos el array para mostrarlo en la vista principal, de cada libro mostramos su título y portada. Esta información, como ya dijimos, está almacenada en la Base de Datos, pero hemos de entender que el archivo .png o .jpg no es lo que se almacena en la BD. En la columna “portada” de la tabla de libros lo que almacenamos es el nombre del archivo de la imagen; un string (por ejemplo portada_drácula.png). Nosotros sabemos que las imágenes están guardadas en public/portadas, por lo que en la vista cargamos la imagen concatenando la dirección de la carpeta con el nombre de la imagen guardada en el atributo del libro: <img src="{{ url('portadas/' . $libro->portada) }}".
Paginación
Conforme vayamos añadiendo libros, el listado principal podría mostrar demasiados libros a la vez. Laravel nos ofrece una sencilla sentencia para paginar los elementos concatenando en la query el método “->paginate(nº de elementos por página)”. Esto hará que se muestre únicamente el número de elementos que hayamos indicado, en nuestro caso cada página mostrará 20 libros y se crearán tantas páginas como se necesite para mostrar los libros de 20 en 20 (Figura 6.7). Esto añadirá al array un atributo “render” al cual accederemos desde la vista y lo colocaremos abajo del todo, mostrando los botones de páginas para que el usuario navegue por ellas.
Figura 6.7. Paginación
6.1.5. Funcionalidad de la Barra de Navegación
Una vez tenemos la vista del listado definida, podemos cargar el layout principal para mostrar también la barra de navegación (Figura 6.8).
Con independencia de la vista en la que nos encontremos, podremos utilizar las funcionalidades de la barra. El icono de YouBook nos llevará de vuelta a la vista principal. Presenta del mismo modo una barra de búsqueda donde podremos buscar los libros por su nombre en lugar de ir buscándolo entre las páginas. El buscador pasará al controlador el texto introducido por el usuario, y el controlador realizará una query para obtener una lista de libros que coincida con el nombre. La barra de búsqueda está configurada para guardar el texto introducido anteriormente (Figura 6.9), por lo que mostrará sugerencias de autocompletado conforme escribamos.
Figura 6.9. Barra de Búsqueda
Entonces redirigirá a la página del lista de libro, pero con el resultado de la búsqueda ordenándolos por el número de likes (Figura 6.10).
Figura 6.10. Resultado de Búsqueda
El array de libros filtrados también será devuelto con el método de paginación por si el resultado tuviese más de 20 obras.
Sistema de Pago PayPal
YouBook ofrece a los usuario un botón de PayPal[37] por si desean hacer una donación al sitio web. Al pulsar sobre el botón serán dirigidos a la página de PayPal indicando el correo de YouBook, para que el usuario, si cuenta con una cuenta de PayPal, introduzca sus datos y la cantidad que desea donar (Figura 6.11).
Figura 6.11. Donaciones vía PayPal
Iniciar/Cerrar sesión
Los usuarios iniciarán sesión a través de un enlace de la barra de de navegación. Laravel nos permite en todo momento saber si hay un usuario identificado usando el método 'Auth::check()'. Si el usuario no se ha identificado, en el enlace mostraremos “Iniciar Sesión” y al pulsar sobre él se le redirigirá a la vista del login Y si sí ha iniciado sesión, mostraremos “Cerrar sesión”, que desconectará la cuenta del usuario y también lo redirigirá a la vista del login (Figura 6.12).
Con la instalación de laravel ya vienen por defecto las vistas del login y registro (nosotros tan solo debemos añadir el layout principal para que incorpore la barra de navegación). Incluye del mismo modo un controlador que gestiona las acciones de registro y de login (validación de campos y recordar contraseña). Si al iniciar sesión introducimos una cuenta no registrada nos avisará del error (Figura 6.13).
Figura 6.13. Correo no registrado
Y lo mismo al registrar, comprobará que los campos sigan unas reglas, como que la contraseña tenga un mínimo de 6 caracteres o que el email tenga el formato correcto de un correo electrónico (Figura 6.14).
Figura 6.14. Registrar Usuario
El modelo Usuario (app/User.php) también viene incluido en Laravel, pero solo cuenta con los atributos (columnas de la tabla) email, name y password. Para YouBook necesitamos configurar un usuario más complejo. En la imagen 5.9 del