Bygg databasen till en Eshop (del 1)

By . Latest revision .

Du har utfört en ER-modellering av en databas för en Eshop och nu skall du påbörja implementationen av databasen.

Du skall fylla databasen med visst innehåll och du skall skapa två klienter, en webbaserad klient och en terminalklient, som jobbar mot databasen.

Du kan utföra denna uppgift enskilt, eller i samma grupp som utförde ER-modelleringen.

Alla lämnar in en egen lösning i sitt kursrepo, även om man jobbat i grupp.

#Förkunskaper

Du har utfört uppgiften “Skapa ER-modell för en databas (logisk/fysisk)” och du har SQL DDL för att skapa databas och tabeller.

Du har löst uppgiften “Flytta pengar med terminalprogram och med Express” och du har därmed både terminalklient och webbklient att utgå ifrån samt har du koll på vad transaktioner är.

Du har jobbat igenom övningarna “Lagrade procedurer i databas” och “Triggers i databas” så du har koll på vad lagrade procedurer och triggers är.

#Introduktion och förberedelse

Du skall bygga en webbklient och en terminalklient. Du har tidigare kod som du kan utgå ifrån. Kopiera den för att komma igång snabbt.

Börja med att kopiera din fil ddl.sql från modelleringsuppgiften, till nuvarande katalog och utgå från den. Var redo på att du kan behöva modifiera tabellstrukturen för din databas, så att du kan lösa uppgiften.

När du fyller databasen med innehåll så kan du utgå från följande Excelark, “Databasen eshop, del 1, innehåll till tabeller”. Ta en egen kopia av arket och därefter kan du fritt modifiera innehållet i tabellerna och vilka kolumner som finns.

#Kodstandard små bokstäver

Kom ihåg att vi använder en kodstandard som säger små bokstäver på tabeller, vyer, procedurer, triggers och kolumnnamn.

Du kan läsa om “Kodstandard i SQL, små bokstäver och underscore _” i forumet.

#Backup med lagrade procedurer

När du tar din backup måste du ange --routines så att dina lagrade procedurer följer med. Om du har sätter CHARSET/COLLATION på databasen så behöver du även se till att den informationen kommer med i backupfilen.

Du kan läsa mer i forumet på “Backup av databasen inklusive lagrade procedurer”.

#Testa din lösning

När du är helt klar med uppgiften så är det ett par saker som du kan göra för att testa din inlämning. Detta testar inte allt, men det är ett minimum av ett flöde som skall fungera.

I webbklienten:

  1. Kolla översikt av kategorier.
  2. Lägg till en ny produkt.
  3. Redigera den nya produkten.
  4. Visa produkten i översikten.

I terminalklienten.

  1. Visa hyllor på lagret.
  2. Visa vilka produkter som finns på hyllorna.
  3. Lägg till den nya produkten på en godtycklig lagerhylla.
  4. Se att produkten finns på lagret med rätt antal på rätt hylla.

#Krav

Uppgiften är indelad i tre huvudsakliga delar, en generell del inklusive databasdetaljer, en för webbklienten och en för terminalklienten.

#Generella krav

  1. Din katalog innehåller en package.json med samtliga externa moduler som används.

  2. Inloggningsdetaljer till databasen skall sparas i config/db/eshop.json.

  3. SQL-filer lägger du i sql/eshop. Skapa filen setup.sql för att skapa databasen och användaren. Låt din databas heta eshop och ge användaren user full tillgång till databasen.

  4. Skapa filen sql/eshop/ddl.sql där du samlar all kod som skapar tabeller, vyer, procedurer, triggers och liknande. Använd den filen för att skapa databasens schema.

  5. Skapa filen insert.sql med SQL-kod för att lägga in minst 5 vardera, av följande: kunder, produkter, produktkategorier, lagerhyllor som du läser in från CSV-filer som du själv skapat. CSV-filerna sparar du i samma katalog som sql-filerna.

  6. Försäkra dig om att samtliga produkter tillhör minst en produktkategori. Försäkra dig om att minst tre av produkterna tillhör två eller fler produktkategorier. Skriv kod i insert.sql, om det krävs.

  7. Försäkra dig om att samtliga produkter finns på lagret, i någon omfattning. Skriv kod i insert.sql, om det krävs.

  8. Du skall ha en loggtabell som loggar intressanta händelser i systemet, via triggers. Du skall logga när någon gör INSERT, UPDATE och DELETE på tabellen produkt. Du loggar tiden då något hände och en textsträng som beskriver händelsen och det objekt som var inblandat i händelsen. Till exempel så här.

Tidstämpel Händelse
2019-02-18 16:01:01 “Ny produkt lades till med produktid ‘produkt1’.”
2019-02-18 16:02:01 “Detaljer om produktid ‘produkt1’ uppdaterades.”
2019-02-18 16:03:01 “Produkten med produktid ‘produkt1’ raderades.”

#Webbklient

  1. Skapa en webbklient med Express. Servern startas via node index.js och skall snurra på porten 1337.

  2. All access från klienten mot databasen skall gå via lagrade procedurer.

  3. Alla sidor skall ha samma sidlayout med gemensam header, footer och det skall gå att klicka sig fram mellan sidorna, via navigeringen.

  4. I webbklienten, skapa routen /eshop/index som visar en välkomstssida till din eshop. Välj själv vad du visar på förstasidan.

  5. I webbklienten, skapa en sida /eshop/category som visar en tabell över de produktkategorier som finns.

  6. I webbklienten, skapa en sida /eshop/product som visar en översikt av de produkter som finns. Visa (minst) produktens id, namn, pris och antal som finns i lagret. Visa även information om vilken kategori som produkten tillhör (TIPS GROUP_CONCAT).

  7. Skapa CRUD för att lägga till, redigera, visa och radera produkter. Du behöver enbart redigera de delar som finns i tabellen kopplad till produkten. Du behöver inte redigera antal produkter på lagret, eller kopplingen till kategori.

  8. Se till att det är smidigt att navigera i din produkt CRUD, via länkar och/eller formulär, man skall kunna klicka sig fram till det man vill göra.

#Terminalklient

  1. Bygg ett terminalprogram och spara main-funktionen i cli.js. Eventuell övrig kod lägger du i moduler under katalogen src/. Terminalprogrammet skall startas med node cli.js.

  2. All access från klienten mot databasen skall gå via lagrade procedurer.

  3. Ditt terminalprogram skall fungera som en oändlig kommandoloop där man kan skriva in kommandon som programmet utför. Det skall finnas ett kommando menu som visar menyn med samtliga kommandon. När man skriver kommandot exit skall programmet avslutas.

  4. Skapa kommandot log <number> som visar de <number> senaste raderna i loggtabellen.

  5. Skapa kommandot shelf som visar vilka lagerhyllor som finns på lagret.

  6. Skapa kommandot inventory som visar en tabell över vilka produkter som finns var i lagret. Visa produktid, produktnamn, lagerhylla och antal.

  7. Skapa kommandot inventory <str> där det optionella argumentet <str> används för att filtrera det som skrivs ut. Filtrering sker på produktid, produktnamn, lagerhylla.

  8. Skapa kommandot invadd <productid> <shelf> <number> som lägger till ett visst antal produkter på en lagerhylla.

  9. Skapa kommandot invdel <productid> <shelf> <number> som plockar bort ett visst antal produkter från en viss lagerhylla.

#Lämna in

  1. När du är helt klar och har testkört ditt system mot din egen databas, så tar du en backup av databasen med mysqldump och sparar i sql/eshop/backup.sql. Använd optionen --routines så att procedurerna följer med. Verifiera att backup-filen fungerar och tänk att rättaren kan ladda denna databas för att testköra mot ditt system.

  2. Validera din kod.

# Flytta till kurskatalogen
dbwebb validate eshop1

Rätta eventuella fel som dyker upp och publisera igen. När det ser grönt ut så är du klar.

#Extrauppgift

Gör följande om du har tid och energi.

  1. I webbklienten, gör så att man kan klicka på en kategori och sedan visas de produkter som finns i kategorin.

  2. I webbklienten, gör så att man kan koppla en produkt till en eller flera produktkategorier (överkurs).

#Tips från coachen

Läs gärna på om GROUP_CONCAT som kan vara smidigt att använda när man vill göra en rapport som till exempel visar vilka kategorier som en produkt tillhör. Det finns ett tips i forumet om GROUP_CONCAT.

Du kan med GROUP_CONCAT skapa följande rapport, se kategorierna.

+----+-------+-------+-------------+
| id | name  | price | category    |
+----+-------+-------+-------------+
| p1 | Apple |  42.0 | fruit,red   |
| p2 | Pear  |  39.0 | fruit,green |
+----+-------+-------+-------------+

I forumet finns ett tips om hur du kan hantera optionella argument i terminalklienten, se “Kommando med optionella argument (eshop1/2)”.

Lycka till och hojta till i forumet om du behöver hjälp!

#Revision history

  • 2019-03-13: (D, mos) Tips om optionella argument.
  • 2019-03-11: (C, mos) Förtydligande och hjälptext om kodstandard, backup och tips till hur testa.
  • 2019-02-25: (B, mos) Tips om GROUP_CONCAT och dump av procedurer.
  • 2019-02-18: (A, mos) Första utgåvan, sammanslagen av tre andra uppgifter och vidarutvecklad.

Document source.

Category: javascript, nodejs, mysql, express, er-modellering, kursen databas.