[PRÁCTICA RESUELTA]Programación web

La siguiente práctica es un sitio de intercambio de videojuegos:

Descripción

Está práctica consiste en crear una aplicación web que permita la gestión de un club de intercambio de videojuegos.
La aplicación debe permitir gestionar tres grupos de usuarios: invitados, socios, administradores. Los invitados solo podrán acceder a información sobre los video juegos disponibles para intercambio. Los socios podrán gestionar su cuenta, ofreciendo juegos para intercambiar. Los administradores podrán gestionar los usuarios y los videojuegos.

Detalle de casos de uso según tipo de usuario

Invitados

  • Acceder a la información general del club
  • Buscar en videojuegos (mostrando si están disponibles para intercambio)
  • Darse de alta como socio
  • Identificarse como usuario registrado

Socio

  • Todas los casos de uso de invitado
  • En el listado de juegos se mostrará cuántas unidades están disponibles
  • Listado de socios que ofrecen un juego concreto
  • Modificar datos del perfil
  • Ofrecer un juego para intercambio (seleccionado de la lista de disponibles). Los juegos los añade un administrador, los socios ofrecen una unidad para intercambio.
  • Dejar de ofrecer un juego para intercambio
  • Dejar de estar identificado en el servidor

Administrador

  • Todas los casos de uso de socio
  • Eliminar un socio (y todos sus datos)
  • Añadir/modificar/eliminar un juego

Tecnologías a emplear

Para el desarrollo de esta práctica se debe emplear PHP como lenguaje de programación en el servidor, SQLite3 como gestor de Bases de Datos, y para la programación del lado del cliente se permite usar JQuery como apoyo a JavaScript.
Como entorno de desarrollo se puede utilizar la plataforma aulaga o el entorno de desarrollo Netbeans. Para usar la plataforma aulaga no es necesario realizar ninguna configuración. Se debe tener en cuenta que en caso edición simultánea de la entrega en grupo se almacenará la última guardada.
La base de datos a emplear, por su sencillez de configuración y uso, será SQLite. Como abstracción de acceso a bases de datos se debe emplear PDO PHP Data Objects. Ejemplos de manejo de la base de datos SQLite.

Tablas

En aulaga se tendrá disponible como base de datos SQLite (no es necesario crearlo) el fichero datos.db con las tablas creadas y algunos datos de prueba. Para crear el objeto de gestión de la base de datos, usar
$db = new PDO("sqlite:./datos.db");
/* Es necesaria la siguiente instrucción para activar
la integridad referencial en la BD */
$db -> exec("PRAGMA foreign_keys = ON;");

usuarios

Campo Descripción
id Identificador numérico único del usuario
usuario Nombre de cuenta
clave Clave del usuario (cifrado con MD5)
nombre Nombre del usuario
email Dirección de correo electrónico
tipo Usuario normal o administrador (0 socio normal y 1 administrador) 

juegos

Campo Descripción
id Identificador numérico único del juego
plataforma Plataforma del juego
nombre Nombre del juego
descripcion Descripción
URL Dirección de la página web del juego

cambiables

Campo Descripción
juego Identificador del juego
usuario Identificador del usuario
Se dispone inicialmente de 4 usuarios/claves: admin/1234, fulano/1, mengano/2 y zutano/3.

Programación del lado del cliente

Se requiere que los formularios sean validados apropiadamente antes de ser enviados al servidor. Lo dicho antes no implica no realizar de nuevo todas las comprobaciónes necesariias en el servidor. Se debe usar en al menos una página peticiones AJAX para realizar la tarea solicitada. Por ejemplo: cuando un socio o administrador esté en el listado de juegos podrá pulsando en un botón/enlace y sin cambiar de página ofrecer (o dejar de ofrecer) un juego como cambiable mediante una petición AJAX.

Nota:

Las tablas anteriores no tienen la estructura más apropiada para este problema. En el diseño de las tablas ha primado la sencillez de la solución necesaria.

Esquema y Datos de la BD

Use el siguiente código si desea crear la BD fuera de aulaga
CREATE TABLE [usuarios]
(
    [id] INTEGER PRIMARY KEY,
    [usuario] NVARCHAR(20)  NOT NULL,
    [clave] NVARCHAR(32)  NOT NULL,
    [nombre] NVARCHAR(200),
    [email] NVARCHAR(200),
    [tipo] INTEGER
);
CREATE UNIQUE INDEX IF NOT EXISTS [indexusuario] on [usuarios] ([usuario]);
CREATE UNIQUE INDEX IF NOT EXISTS [indexemail] on [usuarios] ([email]);

CREATE TABLE [juegos]
(
    [id] INTEGER PRIMARY KEY,
    [plataforma] NVARCHAR(60),
    [nombre] NVARCHAR(60),
    [descripcion] NVARCHAR(120),
    [URL] NVARCHAR(120)
);

CREATE TABLE [cambiables]
(
    [usuario] INTEGER  NOT NULL,
    [juego] INTEGER  NOT NULL,
    CONSTRAINT 'unico' UNIQUE ([usuario],[juego]),
    FOREIGN KEY ([usuario]) REFERENCES [usuarios] ([id]) 
  ON DELETE CASCADE,
    FOREIGN KEY ([juego]) REFERENCES [juegos] ([id]) 
  ON DELETE CASCADE
);
CREATE UNIQUE INDEX IF NOT EXISTS [indexusuariojuego] on [cambiables] ([usuario],[juego]);

/*******************************************************************************
   Populate Tables
********************************************************************************/
INSERT INTO [usuarios] ([usuario], [clave], [nombre], [email], [tipo]) VALUES ('admin', '81dc9bdb52d04dc20036dbd8313ed055', 'Administrador', 'admin@intercambio.com', 1);
INSERT INTO [usuarios] ([usuario], [clave], [nombre], [email], [tipo]) VALUES ('fulano', 'c4ca4238a0b923820dcc509a6f75849b', 'Fulano de Tal', 'fulano@nomail.com', 0);
INSERT INTO [usuarios] ([usuario], [clave], [nombre], [email], [tipo]) VALUES ('mengano', 'c81e728d9d4c2f636f067f89cc14862c', 'Mengano de Cual', 'mengano@nomail.com', 0);
INSERT INTO [usuarios] ([usuario], [clave], [nombre], [email], [tipo]) VALUES ('zutano', 'eccbc87e4b5ce2fe28308fd9f2a7baf3', 'Zutano de Sal', 'zutano@nomail.com', 0);

INSERT INTO [juegos] ([plataforma], [nombre], [descripcion], [URL]) VALUES ('PS4', 'he Order: 1886', 'The Order 1886 es un videojuego de corte fantástico y ambientación de época para PlayStation 4', 'http://readyatdawn.com');
INSERT INTO [juegos] ([plataforma], [nombre], [descripcion], [URL]) VALUES ('PS4', 'Far Cry 4', 'Oculto entre las imponentes cumbres del Himalaya se esconde Kyrat, un paraíso sumido en la tradición y la violencia...', 'http://far-cry.ubi.com');
INSERT INTO [juegos] ([plataforma], [nombre], [descripcion], [URL]) VALUES ('DS3', 'The Legend of Zelda: Majora´s Mask 3D', 'The Skull Kid personifies the mischief and mystery of the Lost Woods, but a cursed mask has now morphed him into something exceedingly more terrifying.', 'https://www.nintendo.es/Juegos/Nintendo-3DS/The-Legend-of-Zelda-Majora-s-Mask-3D-941070.html');
INSERT INTO [juegos] ([plataforma], [nombre], [descripcion], [URL]) VALUES ('PS4', 'Assassin s Creed Liberation', 'Corre el año 1765. Mientras la Revolución Americana se prepara en Boston y Nueva York, en el sur los españoles planean hacerse con el control de Luisiana para servirla en bandeja a los templarios', 'http://assassinscreed.ubi.com/');
INSERT INTO [juegos] ([plataforma], [nombre], [descripcion], [URL]) VALUES ('PS4', 'Call of Duty®: Advanced Warfare', 'CALL OF DUTY: ADVANCED WARFARE TAKES PLACE IN A PLAUSIBLE FUTURE IN WHICH TECHNOLOGICAL PROGRESS AND TODAY’S MILITARY PRACTICES HAVE CONVERGED WITH POWERFUL CONSEQUENCES.', 'https://www.callofduty.com');

INSERT INTO [cambiables] ([usuario], [juego]) VALUES (1,1);
INSERT INTO [cambiables] ([usuario], [juego]) VALUES (1,4);
INSERT INTO [cambiables] ([usuario], [juego]) VALUES (2,2);
INSERT INTO [cambiables] ([usuario], [juego]) VALUES (2,3);
INSERT INTO [cambiables] ([usuario], [juego]) VALUES (3,1);
INSERT INTO [cambiables] ([usuario], [juego]) VALUES (4,1);
INSERT INTO [cambiables] ([usuario], [juego]) VALUES (4,2);
INSERT INTO [cambiables] ([usuario], [juego]) VALUES (4,5);
 

0 comentarios: