Computación Web (2024/25)

Proyecto: Tienda Web

Introducción

En este proyecto desarrollarás la aplicación web de una tienda en línea. La tienda estará especializada en un sector comercial concreto de tu elección, como por ejemplo ropa, electrónica, libros, instrumentos musicales, coches, etc.

La aplicación permitirá a los usuarios, como mínimo, navegar el catálogo de productos, ver los detalles de cada producto, añadir productos al carro de la compra, finalizar la compra de los productos en el carro y consultar el historial de compras realizadas. Para no complicar el proyecto en exceso, no se implementará la funcionalidad de pago, asumiendo que el pago se realiza fuera de la aplicación.

La aplicación permitirá que los usuarios creen una cuenta, inicien sesión y cierren sesión. Cualquier usuario podrá navegar el catálogo de productos, pero solo los usuarios autenticados podrán añadir productos al carro de la compra y finalizar la compra.

El proyecto se dividirá en funcionalidad obligatoria, que toda entrega debe implementar, funcionalidad adicional y funcionalidad avanzada. Tienes libertad para decidir qué funcionalidad adicional y avanzada deseas implementar en tu proyecto.

Condiciones generales

Las siguientes condiciones aplican al proyecto:

Funcionalidad obligatoria

Cualquier funcionalidad que no se mencione expresamente en esta sección no es obligatoria. La funcionalidad no obligatoria que implementes será evaluada como funcionalidad adicional o funcionalidad avanzada.

Todas las entregas deben implementar la siguiente funcionalidad:

Modelo de datos

Tu proyecto debe dar soporte al siguiente modelo de datos para la funcionalidad obligatoria. Puedes desviarte de este modelo de datos si tienes razones justificadas para hacerlo. Por ejemplo, puedes enriquecer este modelo de datos debido a las necesidades de cualquier funcionalidad adicional que implementes (añadir nuevas entidades, añadir nuevas propiedades a algunas entidades, etc.), o si crees que un esquema diferente es mejor en el contexto de tu diseño del proyecto.

Las principales entidades a almacenar en la base de datos son:

  • Usuarios: se identifica a los usuarios por su dirección de correo electrónico, que será única en la aplicación. Cada usuario se autentica mediante dicha dirección de correo y una contraseña, que debe ser almacenada en la base de datos de forma segura, cifrada y con valor de salt (por ejemplo, usando bcrypt como en las prácticas). Se deben guardar también, al menos, el nombre y apellidos del usuario.
  • Productos: para cada producto se guardarán un nombre y una descripción. Además, habrá otros campos con información específica, que dependerán del tipo de productos que ofrezca tu tienda. Por ejemplo, si se trata de una tienda de libros, se podrían guardar el autor, la editorial, el número de páginas, el ISBN, etc.
  • Categorías de productos: los productos estarán organizados en categorías. Las categorías disponibles en la tienda serán también entidades a almacenar en la base de datos.
  • Precios: para cada producto se guardará su precio. Los precios pueden variar con el tiempo, por lo que se guardará también la fecha y hora de inicio de validez del precio. Los precios pasados deben ser conservados en la base de datos. En cada momento está en vigor el precio más reciente de un producto de entre aquellos precios cuya fecha de entrada en vigor no esté en el futuro. Dada una compra realizada en el pasado, se puede determinar el precio de cada producto en el momento de la compra consultando el precio con fecha de inicio de validez más reciente pero anterior a la fecha de la compra.
  • Carro de la compra: el carro de la compra de cada usuario estará compuesto por diversos productos, donde cada producto estará asociado a un número de unidades. Necesitarás una entidad adicional para representar un producto con número de unidades ligado a un carro de la compra.
  • Compras: para cada compra formalizada por un usuario se almacenarán la fecha y hora de confirmación del mismo, el nombre y apellidos del destinatario, la dirección de entrega, el importe total de la compra y los productos comprados junto con el número de unidades de cada uno. Necesitarás una entidad adicional para representar un producto con número de unidades ligado a una compra.

Vistas

Tu aplicación debe proporcionar al menos las siguientes vistas:

  • Vista principal (abierta también a usuarios no autenticados): la composición de esta vista es libre, con la restricción de que debe dar acceso a las funcionalidades de la tienda. Por ejemplo, se pueden presentar productos destacados de la tienda, la lista de categorías de productos, el formulario de búsqueda de productos, campañas actuales, etc.
  • Vista de producto (abierta también a usuarios no autenticados): se presenta la información detallada de un producto, incluyendo su precio actual y, al menos, una imagen del mismo (véase Imágenes de productos). Si el usuario está autenticado, se mostrará también un botón para añadir una unidad del producto al carro de la compra. Se mostrará la categoría a la que pertenece el producto, como enlace a la vista de dicha categoría.
  • Vista de categoría (abierta también a usuarios no autenticados): se presenta un listado con todos los productos de una categoría. Cada producto enlazará con la vista de dicho producto.
  • Vista de carro de la compra (abierta solo a usuarios autenticados): se presenta el contenido del carro de la compra. Se permitirá al usuario vaciar el carro de la compra, eliminar productos individuales del carro de la compra y editar el número de unidades de cada producto. Cada producto enlaza con la vista de producto correspondiente. Se muestran el importe de cada producto en el carro, según el precio actual en vigor (que podría no coincidir con el precio en el instante en que se añadió al carro), y el importe total del carro de la compra.
  • Vista de confirmación de compra (abierta solo a usuarios autenticados): se presenta la información necesaria acerca de la compra a realizar (productos, número de unidades, precios, etc.) y se solicitan los datos necesarios para la entrega (nombre y apellidos del destinatario, dirección de entrega). Por defecto se usa como nombre del destinatario el nombre registrado en la cuenta del usuario, pero el usuario puede cambiarlo por otro nombre.
  • Vista de historial de compras (abierta solo a usuarios autenticados): se presenta un listado con todas las compras realizadas por el usuario indicando, para cada compra, fecha y hora de confirmación e importe total. Cada entrada debe enlazar con la vista de compra correspondiente.
  • Vista de compra pasada (abierta solo a usuarios autenticados): se presenta la información detallada de una compra pasada realizada por el usuario, incluyendo fecha y hora de confirmación, importe, destinatario y dirección de envío y el listado de productos con su precio y número de unidades. Cada producto enlaza con la vista de producto correspondiente.

Puedes tomar la lista de vistas anterior como una sugerencia. Eres libre de diseñar tu aplicación con vistas diferentes siempre y cuando proporciones la misma funcionalidad. También puedes cambiar estas vistas para acomodar funcionalidad adicional.

Imágenes de productos

Cada producto debe tener al menos una imagen. Aunque no es como lo haría una aplicación real, en este proyecto, para no aumentar demasiado la complejidad, las imágenes de los productos podrán ser guardadas como ficheros estáticos en el directorio de ficheros estáticos de la aplicación. Se podría, por ejemplo, nombrar las imágenes con el identificador del producto, de tal forma que sea inmediato construir su URL relativa a partir de dicho identificador.

Por ejemplo, si el identificador de un producto es 42, se podría guardar su imagen como public/images/product-42.png.

Para decidir el tipo de datos de la imagen, puedes asumir un tipo de datos único para todas las imágenes (por ejemplo, PNG), o añadir una columna en la tabla de productos para especificar el tipo de datos de la imagen de cada producto. Este tipo de datos se usaría para componer la parte de la extensión (por ejemplo, .png) de la URL de la imagen.

No obstante, puedes optar por una solución diferente si lo consideras más adecuado. Por ejemplo, podrías guardar las imágenes en la base de datos.

Funcionalidad adicional

El resto de la funcionalidad a desarrollar podrá ser elegida libremente por cada grupo, para obtener hasta 1,5 puntos adicionales conforme a los criterios de evaluación.

Una o dos funciones adicionales, dependiendo de su complejidad, podrían aportar la nota máxima de este apartado. Puedes consultar con los profesores en cualquier momento para saber a qué nota aspiras según lo que pretendas implementar.

Funcionalidad avanzada

Para obtener el punto de funcionalidad avanzada previsto en los criterios de evaluación debes hacer uso de otras tecnologías que no se hayan visto en clase o se hayan visto con menor profundidad.

Se proponen, a modo de referencia, algunas posibilidades a continuación, pero puedes implementar cualquier otra que pactes previamente con los profesores:

Cada aspecto avanzado se evaluará en función de la complejidad de su implementación, teniendo además en cuenta la dificultad técnica, documentación disponible, etc.

También puedes implementar otros aspectos avanzados propuestos por ti, siempre que supongan profundizar en alguna de las tecnologías vistas en clase o el uso de otras tecnologías nuevas. Debes consultar previamente con los profesores para saber si tu propuesta resulta adecuada y obtener una estimación de cómo se valoraría en tu calificación. No se valorará que desarrolles nueva funcionalidad que simplemente consista en utilizar las mismas técnicas que se usan en la funcionalidad obligatoria y adicional.

Uno de los aspectos que más se valorarán con respecto a esta funcionalidad avanzada es tu capacidad para utilizar la documentación disponible y resolver los problemas de forma autónoma. Por ello, contarás con un soporte más limitado por parte de los profesores que para la funcionalidad obligatoria y adicional.

Es muy aconsejable que, al principio del proyecto o durante el desarrollo del mismo, pidas a los profesores una estimación de la puntuación que obtendrías por la implementación de cada función adicional o avanzada que te plantees realizar. Esto te permitirá conocer qué debes desarrollar para alcanzar la puntuación a la que aspires.

Criterios de evaluación

Aviso: el presente proyecto es una prueba de evaluación. El plagio y otros tipos de fraude académico relativos al mismo serán denunciados a las autoridades académicas conforme a la normativa en vigor.

En la evaluación se tendrá en cuenta la correcta implementación de la funcionalidad obligatoria, funcionalidad adicional y funcionalidad avanzada, así como diversos aspectos de calidad de su implementación:

Los criterios de calidad que se espera que cumpla tu proyecto son:

Más detalles sobre el uso de herramientas de inteligencia artificial generativa

El uso de inteligencia artificial generativa está permitido en el desarrollo del proyecto, siempre que no incluyas grandes fragmentos de código generados por una inteligencia artificial en tu entrega.

Todos los estudiantes deben adjuntar a su entrega una declaración acerca del uso de inteligencia artificial generativa que incluya, al menos, la siguiente información:

Algunos ejemplos de usos recomendados de inteligencia artificial generativa son:

Se recomienda que siempre revises cualquier fragmento de código generado por una inteligencia artificial antes de incluirlo en tu proyecto, y que te asegures de entender cómo funciona cualquier fragmento de código que incluyas. Además, no confíes ciegamente en los fragmentos de código que la herramienta de inteligencia artificial generativa produzca. Pueden contener errores o hacer algo diferente de lo que necesitas.

Por último, recuerda que tendrás que programar en el examen final, en papel, modelos de datos, consultas a la base de datos, funciones de controlador, plantillas, etc. similares a los del proyecto. Independientemente de cómo uses la inteligencia artificial generativa, asegúrate de ser capaz de programarlos sin ayuda.