Aste online

Paolo Redaelli
Cod. persona 10137952

Specifications

Un’applicazione web consente la gestione di aste online.
Gli utenti accedono tramite login e possono vendere e acquistare all’asta.
La HOME page contiene due link, uno per accedere alla pagina VENDO e uno per accedere alla pagina ACQUISTO.
La pagina VENDO mostra una lista delle aste create dall’utente e non ancora chiuse, una lista delle aste da lui create e chiuse e una form per creare un nuovo articolo e una nuova asta per venderlo.
L'asta comprende l’articolo da mettere in vendita (codice, nome, descrizione, immagine), prezzo iniziale, rialzo minimo di ogni offerta e una scadenza (data e ora, es 19-04-2021 alle 23:00). La lista delle aste è ordinata per data+ora crescente e riporta: codice e nome dell’articolo, offerta massima, tempo mancante (numero di giorni e ore) tra il momento del login e la data e ora di chiusura dell’asta.
Cliccando su un’asta compare una pagina DETTAGLIO ASTA che riporta per un’asta aperta i dati dell’asta e la lista delle offerte (nome utente, prezzo offerto, data e ora dell’offerta) ordinata per data+ora decrescente.
Un bottone CHIUDI permette all’utente di chiudere l’asta se è giunta l’ora della scadenza (si ignori il caso di aste scadute ma non chiuse).
Se l’asta è chiusa, la pagina riporta i dati dell’asta, il nome dell’aggiudicatario, il prezzo finale e l’indirizzo di spedizione dell’utente.
La pagina ACQUISTO contiene una form di ricerca per parola chiave. Quando l’acquirente invia una parola chiave la pagina ACQUISTO si ricarica e mostra un elenco di aste aperte (la cui scadenza è posteriore all’ora dell’invio) il cui articolo contiene la parola chiave nel nome o nella descrizione. La lista è ordinata in modo decrescente in base al tempo (numero di giorni. ore e minuti) mancante alla chiusura. Cliccando su un’asta aperta compare la pagina OFFERTA che mostra i dati dell’articolo, l’elenco delle offerte pervenute in ordine di data+ora decrescente e un campo di input per inserire la propria offerta, che deve essere superiore all’offerta massima corrente. Dopo l’invio dell’offerta la pagina OFFERTA mostra l’elenco delle offerte aggiornate.
La pagina ACQUISTO contiene anche un elenco delle offerte aggiudicate all’utente con i dati dell’articolo e il prezzo finale.

Versione con JavaScript
Si realizzi un’applicazione client server web che modifica le specifiche precedenti come segue:
Dopo il login, l’intera applicazione è realizzata con un’unica pagina.
Se l’utente accede per la prima volta l’applicazione mostra il contenuto della pagina ACQUISTO. Se l’utente ha già usato l’applicazione, questa mostra il contenuto della pagina VENDO se l’ultima azione dell’utente è stata la creazione di un’asta; altrimenti mostra il contenuto della pagina ACQUISTO con l’elenco (eventualmente vuoto) delle aste su cui l’utente ha cliccato in precedenza e che sono ancora aperte. L’informazione dell’ultima azione compiuta e delle aste visitate è memorizzata a lato client per la durata di un mese.
Ogni interazione dell’utente è gestita senza ricaricare completamente la pagina, ma produce l’invocazione asincrona del server e l’eventuale modifica solo del contenuto da aggiornare a seguito dell’evento.

Data requirements analysis

Versione HTML pura

Caption: Entity, attribute, relation, page, view, event, action

Gli utenti accedono tramite login e possono vendere e acquistare all’asta. La HOME page contiene due link, uno per accedere alla pagina VENDO e uno per accedere alla pagina ACQUISTO. La pagina VENDO mostra una lista delle aste create dall’utente e non ancora chiuse, una lista delle aste da lui create e chiuse e una form per creare un nuovo articolo e una nuova asta per venderlo.

L'asta comprende l’articolo da mettere in vendita (codice, nome, descrizione, immagine), prezzo iniziale, rialzo minimo di ogni offerta e una scadenza (data e ora, es 19-04-2021 alle 23:00). La lista delle aste è ordinata per data+ora crescente e riporta: codice e nome dell’articolo, offerta massima, tempo mancante (numero di giorni e ore) tra il momento del login e la data e ora di chiusura dell’asta.

Cliccando su un’asta compare una pagina DETTAGLIO ASTA che riporta per un’asta aperta i dati dell’asta e la lista delle offerte (nome utente, prezzo offerto, data e ora dell’offerta) ordinata per data+ora decrescente.

Un bottone CHIUDI permette all’utente di chiudere l’asta se è giunta l’ora della scadenza (si ignori il caso di aste scadute ma non chiuse).

Se l’asta è chiusa, la pagina riporta i dati dell’asta, il nome dell’aggiudicatario, il prezzo finale e l’indirizzo di spedizione dell’utente.

La pagina ACQUISTO contiene una form di ricerca per parola chiave. Quando l’acquirente invia una parola chiave la pagina ACQUISTO si ricarica e mostra un elenco di aste aperte (la cui scadenza è posteriore all’ora dell’invio) il cui articolo contiene la parola chiave nel nome o nella descrizione. La lista è ordinata in modo decrescente in base al tempo (numero di giorni. ore e minuti) mancante alla chiusura. Cliccando su un’asta aperta compare la pagina OFFERTA che mostra i dati dell’articolo, l’elenco delle offerte pervenute in ordine di data+ora decrescente e un campo di input per inserire la propria offerta, che deve essere superiore all’offerta massima corrente. Dopo l’invio dell’offerta la pagina OFFERTA mostra l’elenco delle offerte aggiornate.

La pagina ACQUISTO contiene anche un elenco delle offerte aggiudicate all’utente con i dati dell’articolo e il prezzo finale.

Versione con JavaScript

Si realizzi un’applicazione client server web che modifica le specifiche precedenti come segue:

  • Dopo il login, l’intera applicazione è realizzata con un’unica pagina.
  • Se l’utente accede per la prima volta l’applicazione mostra il contenuto della pagina ACQUISTO. Se l’utente ha già usato l’applicazione, questa mostra il contenuto della pagina VENDO se l’ultima azione dell’utente è stata la creazione di un’asta; altrimenti mostra il contenuto della pagina ACQUISTO con l’elenco (eventualmente vuoto) delle aste su cui l’utente ha cliccato in precedenza e che sono ancora aperte. L’informazione dell’ultima azione compiuta e delle aste visitate è memorizzata a lato client per la durata di un mese.
  • Ogni interazione dell’utente è gestita senza ricaricare completamente la pagina, ma produce l’invocazione asincrona del server e l’eventuale modifica solo del contenuto da aggiornare a seguito dell’evento.

Completion of specifications

  • L'offerta (bid) deve essere superiore alla più alta maggiorata del rialzo minumo
  • Tutti i prezzi - iniziale, rilancio ed offerte - devono essere quantità positive
  • Password are stored as SHA1 hashes in the database

Database design

Diagramma

Auctions Database schema

					CREATE TABLE `Auctions` (
  `auction_id` int(11) NOT NULL AUTO_INCREMENT,
  `item_id` int(11) NOT NULL,
  `initial_price` decimal(10,2) NOT NULL,
  `minimum_bid` decimal(10,2) NOT NULL,
  `expiring_moment` datetime NOT NULL,
  `moment` datetime NOT NULL DEFAULT current_timestamp(),
  `is_closed` tinyint(1) DEFAULT 0,
  PRIMARY KEY (`auction_id`),
  KEY `Auctions_FK` (`item_id`),
  CONSTRAINT `Auctions_FK` FOREIGN KEY (`item_id`) REFERENCES `Items` (`item_id`),
  CONSTRAINT `Auctions_InitialPrice_CHECK` CHECK (`initial_price` > 0),
  CONSTRAINT `Auctions_MinimumBid_CHECK` CHECK (`minimum_bid` > 0)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4;

				
					
					CREATE TABLE `Bids` (
						`bid_id` int(11) NOT NULL AUTO_INCREMENT, 
						`user_id` int(11) NOT NULL,
						`moment` datetime NOT NULL, 
						`bid` decimal(10,2) NOT NULL,
						`auction_id` int(11) NOT NULL, PRIMARY KEY (`bid_id`), 
						KEY `Bids_FK` (`user_id`), 
						KEY `Bids_FK_1` (`auction_id`), 
						CONSTRAINT `Bids_FK` FOREIGN KEY (`user_id`) 
						REFERENCES `Users` (`user_id`),
						CONSTRAINT `Bids_FK_1` FOREIGN KEY (`auction_id`) 
						REFERENCES `Auctions` (`auction_id`), 
						CONSTRAINT `Positive_Bid_Check` 
						CHECK (`bid` > 0) )
				
				 CREATE TABLE `Items` (
					`item_id` int(11) NOT NULL AUTO_INCREMENT, 
					`name` varchar(100) NOT	NULL, 
					`description` text DEFAULT NULL, 
					`picture` varchar(100) DEFAULT NULL,
					`user_id` int(11) NOT NULL COMMENT 'Id of the owner', 
					`mime_type`	varchar(30) DEFAULT NULL, 
					`item_code` varchar(100) DEFAULT NULL,
					PRIMARY KEY (`item_id`), KEY `Items_FK` (`user_id`), 
					CONSTRAINT `Items_FK` FOREIGN KEY (`user_id`) REFERENCES `Users` (`user_id`) 
				); 
				
				 CREATE TABLE `Users` (
					`user_id` int(11) NOT NULL AUTO_INCREMENT, 
					`username` varchar(100)	NOT NULL, `email` varchar(100) DEFAULT NULL, 
					`password` varchar(100) NOT NULL COMMENT 'Stored as SHA1 hash', 
					`address` varchar(100) DEFAULT NULL, PRIMARY KEY (`user_id`), UNIQUE KEY
					`Users_UN` (`username`) ); 

Components

  • Model objects (Beans)
    • Auction
    • Bid
    • Item
    • User
  • Data Access Object (DAO):
    • AuctionsDao
      • add_auction(code, name, description, initial_price, minimum_bid, expiring_moment, user, picture)
      • close_auction(an_auction)
      • addBid (an_auction, a_bid)
      • getAuctionById(an_id)
      • getBidsByAuctionId (int an_id)
      • getOpenAuctions()
      • getOpenAuctionsForUser(a_user)
      • awarded_bids (bidder)
      • searchOpenAuctions (a_search_term)
      • getClosedAuctionsForUser(a_user)
    • ItemsDao
    • UserDao
  • Controllers (servlet) all heirs of AuctionServlet:
    • For static version: CloseAuction AuctionBid BuyPage AuctionDetail CheckLogin ItemPicture SellPage NewAccount
The database connection is created by controllers in the init() method and passed to the DAO

Compontents - controllers for dynamic version

  • AuctionBidData
  • AwardedBidsData
  • NewAuctionData
  • ClosedAuctionsData
  • OpenAuctionsData
  • AuctionDetailData
  • CheckAjaxLogin
  • GetUserData
  • SearchData
  • CloseAuctionData
  • ShippingAddressData

Events: login

Events: search

Events: place bid

Events: create auction

Events: close auction

Javascript event handling