Cphbusiness Lyngby Multimediedesigner, 3. semester MulB13e, gruppe 4 September 2014 http://www.designduck.dk/cph/trorodvin create table costumers ( cno INT(4) Primary key AUTO_INCREMENT, cname VARCHAR(30) NOT NULL CHECK(Da street VARCHAR(35) NOT NULL, zip INT(4) NOT NULL, cemail VARCHAR(45) NOT NULL, cphone VARCHAR(20), pw VARCHAR(30) NOT NULL, sno INT(4) NOT NULL, FOREIGN KEY (zip) REFERENCES zip(zip), FOREIGN KEY (sno) REFERENCES sector(sno ) engine=innodb; create table employees ( eno INT(4) Primary key AUTO_INCREMENT ename VARCHAR(30) NOT NULL, street VARCHAR(35), zip INT(4) NOT NULL, eemail VARCHAR(45) NOT NULL, ephone VARCHAR(20), pw VARCHAR(30) NOT NULL, FOREIGN KEY (zip) REFERENCES zip(zip) ) engine=innodb;
Faktaark Projekt titel: Projekt 1 - Database Klasse: Mulb13e Gruppenummer: 4 Hjemmeside link: http://www.designduck.dk/cph/trorodvin Steffen Marschall Mail: cph-sm148@cphbusiness.dk Portfolio: http://steffenmarschall.com Martin Ungermann Stæhr Mail: cph-ms20@cphbusiness.dk Portfolio: http://martinstaehr.dk Patrick Bomann Tofteng Mail: cph-pt60@cphbusiness.dk Portfolio: http://patricktofteng.dk/cph/1.semester/portfolio/index.php Erik Andreas Münter Mail: cph-em38@cphbusiness.dk Portfolio: cph.designduck.dk 2
Indholdsfortegnelse 2 Faktaark 3 Indholdsfortegnelse 4 Indledning 4 Projektplanlægning 5 Gantt kort 6 ER-Diagram 7 Attribute tabel 9 SQL kode 10 USECASE MODEL 11 UC1 Opret burger 13 UC2 Opret ordre 15 UC3 Opret produkt (Admin) 17 Navigations diagram / Site map 18 CRUD matrix 19 Prototype hjemmeside 20 Aktivitets diagram 21 Bilag 1 - SQL statement UC1 / opret bruger 22 Bilag 2 - SQL statement UC3 / opret ordre 23 Bilag 3 - SQL statement UC3 / opret produkt 3
Indledning Dette projekt skulle vi lave en webshop database for et firma efter vores eget valg. Vi valgte at arbejde med Trørød vinhandel, som vores firma. Databasen skulle opsættes i 3. normalform. Projektplanlægning Vi startede med at tjekke vores opgave igennem og lave en PBS (set herunder) for hvilke produkter der skulle komme ud af denne aflevering. Efter dette valgte vi at udarbejde et gantt kort, som oversigt af vores projekt og tidsforbrug for hver del af projektet. Se Gantt kort på næste side (side 5) 4
Gantt kort 5
ER-Diagram Efter udviklingen af en attribute tabel gik vi igang med sammensætningen af et ER-diagram, ved at skrive database koden i sql. Vi har dog valgt at fremvise ER-diagrammet først i denne rapport. Da det giver et bedre billede for læseren over vores attribute tabel. Som bliver beskrevet på de næste sider. Vores database endte op med at indeholde 10 entiteter, som alle indeholder forskellige typer af attributer. 6
Attribute tabel En attribute tabel bruges som en hurtig måde at få et overblik over en database opsætning. Herunder findes vores attribute tabel, delt op i database tabellerne, med en kort forklaring for hver tabel, hvor vi mente at en forklaring var et behov. Entity Attributes Value Notes Datatype products pno 1-9999 (INT) Unique no. N pname A - Å (VARCHAR) Max. 30 char AN price 10,2 (DECIMAL) Currency Currency stno 1-9999 (INT) Number N qty 1-9999 (INT) Number N mqty 1-9999 (INT) Number N nno 1-9999 (INT) Number N rno 1-9999 (INT) Number N tno 1-9999 (INT) Number N mintemp 1-99 (INT) Number N maxtemp 1-99 (INT) Number N pdesc (TEXT) Text = 65,535 AN fig. 1.1 products I denne tabel findes data over produkter. pno pno er primary key, som auto_increment er (A_I) nye produkter med et unikt produkt nummer. price Vi har en price der er opsat med DECIMAL for at kunne lave priser med 2 decimaler. fx. 199,95 kr. Entity Attributes Value Notes Datatype country nno 1-9999 (INT) Unique no. N nname A - Å (VARCHAR) Max. 70 char AN fig. 1.2 country I denne tabel findes data over lande nno Primary key, der A_I er nye lande. Så de alle har et unikt nummer. nname Opsat med VARCHAR da den skal indeholde landenavne, og skrevet med sql koden således at numre ikke kan forekomme i databasen. Entity Attributes Value Notes Datatype region rno 1-9999 (INT) Unique no. N rname A - Å (VARCHAR) Max. 70 char AN nno 1-9999 (INT) Number N fig. 1.3 region I denne tabel findes data over region/områder nno Her fungerer nno som foreign_key til tabellen country s nno for at hente ned hvilken region der hører til hvilket land. Entity Attributes Value Notes Datatype ptype tno 1-9999 (INT) Unique no. N type A - Å (VARCHAR) Max. 50 char AN fig. 1.4 ptype I denne tabel findes data over produkt typer (rød-, hvid-, mousserende -, dessert- og portvin). Fungerer som country tabellen med unikt nummer pr. type. 7
Entity Attributes Value Notes Datatype costumers cno 1-9999 (INT) Unique no. N cname A - Å (VARCHAR) Max. 30 char AN street A - Å (VARCHAR) Max. 35 char AN zip 1-9999 (INT) Number N cemail (VARCHAR) Max. 45 char AN cphone (VARCHAR) Max. 20 char AN pw (VARCHAR) password 30 char AN sno 1-9999 (INT) Number N fig. 1.5 costumers I denne tabel findes data over kunder/registrede brugere. I vores webshop skal man registrere sig som kunde før du kan købe hvad du har i din kurv. Vi mente at det gav rigtig god mening, da folk som handler i små vinhandler via nettet. Ofte ender op med at være tilbagevendende kunder. pw password. I modsætning til vores navne er det her muligt at bruge alle karakterer, symboler og tal til sin kode. Dog max 30 tegn. Entity Attributes Value Notes Datatype sector sno 1-9999 (INT) Number N sname A - Å (VARCHAR) Max. 20 char AN fig. 1.6 sector I denne tabel findes data over branche. Hvilken branche vores registrede kunder arbejder i. Entity Attributes Value Notes Datatype zip zip 1-9999 (INT) Number N city A - Å (VARCHAR) Max. 30 char AN fig. 1.7 zip I denne tabel findes data over postnumre. Alle danske postnumre er tastet ind i vores database. zip Zip er ikke skrevet til at A_I. Da postnummeret allerede er unikt fra hinanden. city Ved hjælp af zip nummeret kan man hente bynavnet op til eventuelt kunde - eller ansattes adresser. Entity Attributes Value Notes Datatype employees eno 1-9999 (INT) Unique no. N ename A - Å (VARCHAR) Max. 30 char AN street A - Å (VARCHAR) Max. 35 char AN zip 1-9999 (INT) Number N eemail (VARCHAR) Max. 45 char AN ephone (VARCHAR) Max. 20 char AN pw (VARCHAR) password AN fig. 1.8 employees I denne tabel findes data over ansatte. Den fungerer som costumers tabellen, dog har vi fjernet sno (sector), da vi allerede ved hvilken branche vores ansatte arbejder i. 8
Entity Attributes Value Notes Datatype orders ono 1-9999 (INT) Unique no. N cno 1-9999 (INT) Number N ordate DD-MM-YYYY(DATE) Date AN osdate DD-MM-YYYY(DATE) Date AN fig. 1.9 orders I denne tabel findes data over ordre. ordate Orders recieved date. Via vores hjemmesides php kode henter den automatisk den nuværende dato og skriver datoen ind når man modtager en ordre. osdate Orders shipped date. Admin har mulighed i deres admin menu at godkende ordre og sende dem afsted. Entity Attributes Value Notes Datatype odetails ono 1-9999 (INT) Number N pno 1-9999 (INT) Number N qty 1-9999 (INT) Number N fig. 2.0 odetails I denne tabel findes data over ordre detajler. Da der kan forekomme mange ordre og produkter sammen. Bliver vi nød til at have en ekstra tabel der regner ud hvilke ordre der har hvilke produkter og hvor mange af dem der skal bruges. ono, pno Fungerer begge som primary keys. Da man ellers ikke kan fjerne ordre detajler efter udført eller ved fejl bestilling. SQL kode Al SQL kode findes som vedhæftede filer i.zip folderen i underfolderen: SQL filer Database opbygningen Opsætning og sammensætningen af databasens tabeller Filnavn: database-build.sql Database data Info der skal puttes ind i databasen. Filnavn: database-data.sql Database SQL statements Statements for Use Cases. Findes også som bilag 1,2 og 3 i denne rapport. De findes sidst i rapporten. Filnavn: database-statements.sql Zip / postnumre Postnumre sql koden fylder 1180 linier. Da den indeholder alle danske postnumre. Derfor har vi valgt at skille den fra resten af koden. Filnavn: database-zip.sql Få koden til at virke med databasen For at få koden ind i databasen, skal den printes i den rigtige rækkefølge. 1. database-build.sql 2. database-zip.sql 3. database-data.sql 9
USECASE MODEL Opret/rediger bruger Opret/slet/rediger ordre Tilføj/slet/rediger produkt Bruger Slet bruger Admin Brugerprofil - handlinger Adminprofil - handlinger 10
UC1 Opret burger Name: Bruger oprettelse Identifier: UC1 Description: Denne use case illustrerer og forklare hvad der skal ske for at en bruger kan blive oprettet som bruger på hjemmesiden. Goal: At få oprettet en bruger. Preconditions Websitet skal være loaded og brugeren skal udfylde formularen 1. Bruger oprettelses delen af databasen skal være sat op og funktionel Assumptions Brugeren har en browser. Brugeren ønsker at bestille varer. Frequency: Denne use case er estimeret til at foregå så ofte som 10 gange månedligt, ved at tage virksomhedens volume til eftertanke samt dens potentielle målgruppe. Basic Course 1. Use case begynder ved at en potentiel bruger kommer ind på hjemmesiden og vil bestille noget vin, brugeren vil hermed stille og roligt navigere imod opret bruger da dette er den bedste mulighed for en hurtig transaktion og i tilfælde af at kunden er tilbagevendende. 2. Brugeren indtaster hans/hendes oplysninger i oprettelses formularen step by step og godkender betingelser etc. 3. Brugerens oplysninger er nu blevet sendt og gemt i databasen, oprettelsen er fuldendt. Alternate Course A: Brugeren indtastede forkerte oplysninger ved brugerprofil oprettelsen Condition: Brugeren indtastede forkerte oplysninger 1. Brugeren påbegyndte oprettelsen ved at indtaste sine oplysninger og indsendte sin data, dataen indeholdte forkerte oplysninger. 2. Fejlen bliver meddelt til brugeren idét han/hun vil fuldende sin oprettelse og bliver påbedt om at ændre sine oplysninger de steder der er fejl i formularen. 3. Brugeren retter fejlene og indsender sine oplysninger, brugerens oplysninger er nu sendt og gemt i databsen, oprettelsen er fuldendt. 11
Alternate Course B: Brugeren ville bestille en vare med det samme, men oprettede alligevel en bruger 1. Condition: Brugeren ville bestille vare med det samme. 2. Brugeren kom ind på hjemmesiden og navigerede direkte ind for at bestille en vare fremfor at oprette en bruger i foerste omgang. 3. Brugeren bliver påbedt om at lave en bruger så han/hun har nemmere ved at være en tilbagevendende kunde, samt for at spare tid ved hver bestilling. 4. Brugeren indtaster hans/hendes oplysninger i formularen og indsender sine oplysninger, brugerens oplysninger er nu sendt og gemt i databsen, oprettelsen er fuldendt. 5. Efter dette bliver brugeren viderstillet tilbage til sine ordre og checkout på sin nye bruger-konto og kan fortsætte sin bestilling af vare. Post conditions Brugeren har fået sin bruger-konto oprettet og databasen er blevet opdateret med deres information. Actors Brugeren/kunden Extended Use Case UC2 Oprettelse af ordre Notes Brugeren skal så vidt som muligt blive bedt om at lave en bruger på hjemmesiden da dette vil fremskynde processen bag det at lave en bestilling, dette kan betyde at kunden er tilbagevendende. Hvis kunden bliver afbrudt mit i deres bestilling for at skulle oprette en bruger skal oprettelses formularen være kort og kontant og kun indeholde de mest essentielle dele information om brugeren, alt andet er overfladisk og kan blive indsat / redigeret af brugeren på deres profil på et andet tidspunkt. Brugeren kan ikke bestille en ordre uden at have en bruger. SQL statement: Bilag 1 - SQL statement UC1 / opret bruger 12
UC2 Opret ordre Name: Ordre oprettelse Identifier: UC2 Description: Denne use case forklare hvad der skal ske for at en bruger kan oprette en ordre i systemet Goal: At få oprettet en ordre Preconditions: Websitet skal være loaded Ordre oprettelses delen af databasen skal være funktionel Assumptions: Brugeren har et registreret log ind. Brugeren kan betale for varerne med kort/paypal lign. Frequency: Denne use case er estimeret til at foregå imellem 10-30 gange ugentligt, ved at tage virksomhedens volume til eftertanke samt dens potentielle målgruppe. Basic Course: 1. Use case begynder ved at en potentiel kunde er inde på hjemmesiden og har navigeret til produkt siden, brugeren tilføjer herefter de produkter han/hun gerne vil købe til indkøbskurven. 2. Brugeren har valgt alle de produkter han/hun godt kunne tænke sig, i de rigtige mængder og navigere nu videre til checkout via. en knap ved indkøbskurven. 3. Brugeren bliver nu spurgt om de vil registrere en bruger for at have lettere adgang til at oprette ordre hurtigere og nemmere i fremtiden brugeren kan her selv vælge om han/hun vil registrere nu og fortsætte eller blot fortsætte til checkout uden at registere en bruger. 4. Brugeren fortsatte til checkout med det samme og skal nu indtaste sine kort oplysninger eller benytte sig af evt. PayPal 5. Betalingen blev godkendt og pengene blev trukket fra brugerens konto, brugeren bliver nu præsenteret for en side der informere om at ordren blev modtaget og godkendt i systemet 6. Brugeren bliver herefter viderstillet fra forrige side til forsiden/forrige side inden checkout. 13
Alternate Course A: Brugeren opretter en brugerprofil inden han/hun færdiggøre sin ordre. Condition: Brugeren valgte at oprette en bruger lige inden checkout 1. Brugeren valgte de vare han/hun gerne ville købe og gik videre til checkout 2. Brugeren bliver spurgt om de vil oprette en bruger inden checkout og opretter derefter en bruger istedet for at gå direkte til checkout 3. Brugeren indtaster hans/hendes oplysninger i den supplerede formular på samme side, brugerens oplysninger er nu sendt og gemt i databasen 4. Brugeren bliver viderstillet til checkout for at færdiggøre deres ordre efter bruger oprettelsen er godkendt Alternate Course B: Brugeren har allerede en brugerprofil på hjemmesiden og opretter en ordre Condition: Brugeren har allerede en brugerprofil på hjemmesiden 1. Brugeren har valgt alle de produkter han/hun godt kunne tænke sig, i de rigtige mængder og navigere nu videre til checkout via. en knap ved indkøbskurven. 2. Brugeren har sine leveringsaddresse/betalingsmetode gemt på sin brugerprofil de er logget ind med derfor skal brugeren blot trykke på knappen checkout og godkende for at bestille sin ordre af de vare han/hun havde i sin indkøbskurv. Post conditions: Brugeren har bestilt en ordre på hjemmesiden til afsendelse Actors: Brugeren/kunden Extended Use Case: UC1 Oprettelse af bruger SQL statement: Bilag 2 - SQL statement UC2 / opret ordre 14
UC3 Opret produkt (Admin) Name: Produkt oprettelse Identifier: UC3 Description: Denne use case forklare hvad der skal ske for at en admin kan oprette et produkt i systemet Goal: At få oprettet et produkt Preconditions: Websitet skal være loaded Admin skal have en adminprofil og være logget ind Produkt oprettelses delen af databasen skal være funktionel Basic Course: 1. Use case begynder ved at admin logger ind på sin adminprofil og navigerer til den sidde hvor admin har sine adminhandlinger listet, heriblandt produkt oprettelse. 2. Admin åbner produktoprettelsen under adminhandlinger og udfylder den givne formular der angiver alle det nye produkts oplysninger. 3. Når formularen er udfyldt, kan admin sende & gemme det nye produkt i databasen ved at klikke på en knap under selve formularen. 4. Admin bliver nu enten viderstillet til en side hvor han/hun bliver informeret om at produktoprettelsen er succesfuld, eller vist et tekststykke under formularen hvor at han/hun bliver informeret om at oprettelsen var en success. 5. Det nye produkt er nu sendt og gemt i databasen. Frequency: Denne use case er estimeret til at foregå 10 gange månedligt, ved at tage virksomhedens volume til eftertanke samt dens potentielle målgruppe. 15
Alternate Course A: Admin opretter produktet direkte inde i databasen fremfor på hjemmesiden. Condition: Adminhandlinger produktoprettelse giver fejl eller er ikke helt funktionel på hjemmesiden endnu. 1. Admin åbner MySQL Workbench eller phpmyadmin i dette tilfælde, phpmyadmin. 2. Admin navigerer til det korrekte table alt efter hvilket slags produkt det specifikt er der skal tilføjes, og går ind i struktur i menuen, her kan han/hun indsætte en ny kolonne i table. 3. Herefter indtaster admin diverse oplysninger om det nye produkt han/hun har navigeret til, når alle felter er udfyldt korrekt klikker admin på gem. Post conditions: Admin har fået oprettet et nyt produkt i databasen Actors: Admin Notes: Grunden til at der ikke er nogle alternate courses under admin produktoprettelse der drejer sig om at admin har indtastet forkerte oplysninger er fordi at formularen simpelthen ikke vil gå igennem uden at alle felter er i korrekt format, det vil fx. ikke være muligt for admin at give produktet et ID på formularen da dette er auto generet i databasen for at undgå fejl. SQL statement: Bilag 3 - SQL statement UC3 / opret produkt 4. Nu er det nye produkt oprettet og gemt i databasen. 16
Navigations diagram / Site map Struktur over det nye trorodvin.dk, som vores løsning. Selve websitet var ikke et krav til opgaven. Vi har dog udviklet et simpelt site, som har log ind og kurv som fungerer. Bliver beskrevet kort senere i rapporten. 17
CRUD matrix C = Create R = Read U = Update D = Delete 18
Prototype hjemmeside Vi har lavet en prototype af vores webshop, som har basale funktioner som hænger sammen med databasen. Dens basale funktioner virker. Der er dog sider hvor der ingen info findes da det ikke har betydning for vores webshop produkt. Admin login Admin loginpage: http://designduck.dk/cph/s3p1-m/admin_login Email: admin@trorodvin.dk Password: 1234567 I admin menuen findes en lang række funktioner der knytter sig til databasen. Her kan du bl.a. tilføje nye produkter til hjemmesiden eller tilføje et nyt land. Vi har lavet et aktivitets diagram for at fremvise de funktioner der findes ved at bevæge sig rundt på sitet Se næste side for aktivitets diagram (side 20) Hjemmesidens filer PHP Da hjemmesiden i denne omgang ikke er en del af den originale opgave. Vil vi undlade at forklare php filer og tilhørende kode til dette for denne gang, men glæder os til næste projekt hvor dette bliver en mulighed. Alle PHP filer til hjemmesiden ligger i zip folderen i en underfolder Trorodvin.dk - Vi har dog fjernet infoen fra connect.php, da den indeholder koden til designduck.dk personlige database og er irevelant for resten af koden. Mock-up af frontside design ved endelig version 19
Aktivitets diagram Tilbage til Prototype hjemmeside 20
Bilag 1 - SQL statement UC1 / opret bruger /* ============================ = UseCase 1 - Opret bruger = =============================*/ -- Først indtaster vi kunden i vores database i tabellen costumers. -- Insert into costumers(kunder) values (A_I, Kundenavn, Adresse, Postnummer, email, telefonnr, password, branche/sector ) use eamunter_s3p1; insert into costumers values (DEFAULT, Kunde navn, Nørgaardsvej 30, 2800, kunde@navn.dk, 36154500, 1234567, 9 ); -- Herefter tjekker vi om brugeren er blevet oprettet. Ved at finde kunden ved hans/hendes navn. SELECT * FROM costumers WHERE cname = Kunde navn -- Kunden er blevet oprettet og usecase 1 er fuldendt. Tilbage til UseCase 1 21
Bilag 2 - SQL statement UC2 / opret ordre /* ============================ = UseCase 2 - Opret ordre = =============================*/ /* Jens Jensen ønsker at købe fire Norton Malbec Reserve, rød vin. Derfor skal vi bruge hans brugerid (cno). Det finder vi ved at lave et select statement */ use eamunter_s3p1; SELECT costumers.cno FROM costumers WHERE cname = Jens Jensen ; /* Jens Jensens id er 11. Vi kan nu begynde på at oprette en ordre for ham, men først skal vi bruge id et på produktet. Det kan findes ved et lignende select statement. */ SELECT products.pno FROM products WHERE pname = Norton Malbec Reserve ; /* Her finder vi ud af at Norton Malbec Reserve har id nummer 2 i databasen. Nu kan vi fuldføre ordren. Ved at oprette en ordre først for denne dato 19-09-2014. */ INSERT INTO orders(ono,cno,ordate) VALUES (DEFAULT, 11, 2014-09-19 ); -- Vi putter nu en ordre detajle ind. Med ordrenummer, produktnummer og antal. INSERT INTO odetails(ono,pno,qty) VALUES ( 12, 2, 4 ); -- Vi kan nu tjekke om ordren er kommet korrekt ind SELECT costumers.cname AS Kundenavn, orders.ono AS Ordrenummer, products.pname AS Produktnavn, odetails.qty AS Antal, orders.ordate AS Ordre modtaget FROM costumers INNER JOIN orders ON costumers.cno = orders.cno INNER JOIN odetails ON odetails.ono = orders.ono INNER JOIN products ON products.pno = odetails.pno WHERE costumers.cname = Jens Jensen ; /* Her får vi printet infoen om ordren Kundenavn Jens Jensen Ordrenummer 1 Produktnavn Norton Malbec Reserve Antal 4 Ordre modtaget 2014-09-19 Kunden er ordre er modtaget og registreret og UseCase 2 er fuldendt. */ -- Herefter tjekker vi for ordrenummeret SELECT orders.ono FROM orders WHERE cno = 11; -- Vores ordrenummer er 1. Tilbage til UseCase 2 22
Bilag 3 - SQL statement UC3 / opret produkt /* ============================ = UseCase 3 - Opret produkt = =============================*/ /* Først indtaster vi produktet i vores database i tabellen products. Lad os antage vi skal indtaste en rødvin, Marsannay fra Frankrig, Bourgogne. Vi har 50 af dem der skal tastes ind i databasen. Først skal vi finde ud af hvilket nno(landenummer) Frankrig har og rno(region nummer) som Borgougne har, og ikke mindst hvilken tno(type nummer) rødvin har. Det kan findes ved tre simple select statements. */ use eamunter_s3p1; SELECT nno FROM country WHERE nname = Frankrig ; -- Frankrig har nno = 4 /* Herefter kan vi indtaste følgende i products tabellen Insert into products(produkter) values (A_I, Vin navn, Pris, Lagernummer, Nuværende antal, Minimum antal, Land, Region, Type, Minimum temperatur, Maximum temperatur, Produkt beskrivelse ) */ insert into products values (DEFAULT, Marsannay, 199, 10150, 42, 2, 4, 18, 1, 16, 18, Ejendommen har siden 2003 været drevet af familien Lignier. Er beliggende nord for landsbyen Marsannay. Vinmarker er placeret i en dal, hvilket giver meget vind og er godt for dyrkning af vinstokke. Jorden er stenet og drænet. Druerne er 100% Pinot Noir. ); -- Herefter tjekker vi om produktet er blevet oprettet. Ved at finde produktet ved dets navn. SELECT * FROM products WHERE pname = Marsannay ; -- Produktet er blevet oprettet og UseCase 3 er fuldendt. SELECT rno FROM region WHERE rname = Bourgogne ; -- Bourgogne har rno = 18 SELECT tno FROM ptype WHERE type = Rodvin ; -- Rødvin har tno = 1 Tilbage til UseCase 3 23