Documente Academic
Documente Profesional
Documente Cultură
LUCRARE DE LICEN
Coordonator tiinific:
Student:
David Laureniu-Georgian
2015
Coordonator tiinific:
Student:
David Laureniu-Georgian
2015
Cuprins
I INTRODUCERE.....................................................................................................................................4
1.1 Comertul Electronic.........................................................................................................................4
I.2 Beneficiile comertului electronic......................................................................................................7
I.3 Modele de afaceri.............................................................................................................................9
II ROLUL I IMPORTANA INTERNETULUI I A PAGINILOR WEB............................................13
II.1 Scurct Istoric.................................................................................................................................13
II.2 Prezentare si importanta................................................................................................................15
II.3 HTML. Prezentare.........................................................................................................................17
II.4 CSS. Prezentare.............................................................................................................................22
II.5 JavaScript. Prezentare...................................................................................................................25
II.5.1 Limbajul JavaScript................................................................................................................25
II.5.2 Prezentarea bibliotecii JQuery...............................................................................................31
II.6 Limbaje de scripting......................................................................................................................33
II.6.1 Python. Prezentare..................................................................................................................33
II.6.2 Frameworkul web Flask.........................................................................................................38
II.6.3 Administrarea bazelor de date cu SQLAlchemy....................................................................41
III. ARHITECTURA MAGAZINULUI WEB.........................................................................................44
III.1 Prezentarea magazinului..............................................................................................................44
III.2 Strucura backendului aplicaiei....................................................................................................54
III.3 Structura bazei de date.................................................................................................................64
IV. CONCLUZII......................................................................................................................................72
V. BIBLIOGRAFIE.................................................................................................................................74
DAVID LAURENIU
INTRODUCERE
I INTRODUCERE
1.1 Comertul Electronic
ntreprinderile moderne sunt caracterizate printr-o cerere din ce in ce mai mare, prin existen a
unei competiii la nivel mondial si prin sporirea permanent a ateptrilor clien ilor. Ca s poat
raspunda acestor cerinte, ntreprinderile de pe tot globul sunt n plin proces de tranformare
organizational si a modului lor de funcionare. Comerul electronic este o cale prin care se
faciliteaz si sprijin aceste schimbri, la scar global.
Pentru unele firme, comert electronic nseamna orice tranzactie financiar care utilizeaz
tehnologia informatic. Pentru altele, notiunea de comert electronic acoper circuitul complet de
vanzri - inclusiv marketingul si vanzarea propriuzis.
Multi oameni consider comertul electronic ca fiind orice tranzactie comercial condus
electronic pentru cumpararea unor produse cum ar fi crti, CD-uri, bilete de calatorie si altele.
Dar, comertul electronic are, in sens larg, un impact mult mai profund asupra evolutiei afacerilor
si cuprinde, in fapt, nu numai noile achiziii comerciale ci i totalitatea activit ilor care sus in
obiectivele de marketing ale unei firme i care pot include, spre exemplu, publicitate, vanzri,
plai, activitai post-vanzare, servicii catre clieni, etc.
Comertul electronic da posibilitatea firmelor sa devina mai eficiente si flexibile in modul intern
de funcionare, s conlucreze mai strns cu furnizorii si sa devina mai atente fa de nevoile si
asteptrile clienilor. Permite companiilor sa selecteze cei mai buni furnizori, indiferent de
localizarea lor geografica i s vand unei piee globale.
Aceast evoluie are un impact major asupra economiei, in ceea ce priveste crearea de noi
ntreprinderi, diversificarea celor existente i, n special, asupra potenialului pie ei forei de
munc i a gradului de ocupare a acesteia in viitor. Industria comer ului electronic face, n
4
DAVID LAURENIU
INTRODUCERE
general, distincie ntre mai multe tipuri de tranzacii, unele active altele n ateptarea:
- Business-to-Business (B-2-B sau BTB) cuprinde toate tranzaciile ce se efectueaza intre doi sau
mai muli parteneri de afaceri. Aceste tranzacii se bazeaza, de obicei, pe sisteme extranet, ceea
ce nseamna ca partenerii de afaceri acioneaza pe internet prin utilizarea de nume si parole
pentru paginile de web proprii. n termeni practici, n aceasta categorie de comer electronic
poate fi orice firma care utilizeaza internetul pentru a comanda de la furnizori, pentru a primi
facturi si a efectua plai.
- Business-to-Consumer (B-2-C sau BTC) se refera la relaiile dintre comerciant si consumatorul
final, fiind considerat comer electronic cu amnuntul. Aceasta categorie s-a extins foarte mult
datorita World Wide Web : exista acum mall-uri pe tot internetul care ofer toate tipurile de
bunuri de consum, de la prjituri sau vinuri, la calculatoare si automobile.
- Business-to-Administration (B-2-A sau BTA) acopera toate tranzactiile dintre firme si autorit i
administrative locale sau centrale. Spre exemplu, In Statele Unite ale Americii, licita iile publice
lansate de guvern sunt publicate pe internet iar firmele pot rspunde pe cale electronic. In
momentul de fata, aceasta categorie de comert electronic este intr-o faza de dezvoltare primar,
dar se asteapt o extindere rapid, mai ales in contextul in care guvernele si alte autorita i
folosesc propriile metode de promovare a comerului electronic. Aceasta categorie de ecommerce ar putea, n viitor, sa fie utilizat i pentru plata TVA sau a impozitelor firmelor.
DAVID LAURENIU
INTRODUCERE
Odat cu apariia Internetului s-a trecut la comerul electronic bazat pe internet deoarece
folosirea acestuia este mai puin costisitoare. Comerul electronic bazat pe Internet a cunoscut
mai multe etape:
- etapa iniial, etap n care e-mail-ul a fost cea mai folosit tehnologie de transfer a datelor;
- etapa www, care a luat natere odat cu apariia primului browser web(Mosaic);
- etapa interactiv, cnd multe website-uri au introdus protocoale securizate de
comunicaie, aplicaii software pe partea de server i/sau client, formulare, asigurnd
interactivitatea client-furnizor;
- etapa maturizrii web-ului, caracterizat de introducerea lui n cadrul intranetorganizaiei, utilizarea extranet-ului ntre organizaii, utilizarea tehnologiei Python
ului
i
capabilitilor multimedia ale Web-ului, care a devenit, astfel, un valoros canal de reclam
publicitate(Pia Electronic).
6
a
i
DAVID LAURENIU
INTRODUCERE
cerinele
DAVID LAURENIU
INTRODUCERE
de
inspectat
la
tranzaciilor
tradiionale cu software pentru comer electronic (aceste servicii de integrare pot fi costisitoare).
Pe lng problemele tehnologice i legate de software, exist i alte obstacole:
- de natur cultural i legal;
DAVID LAURENIU
INTRODUCERE
viziteaz,
ce
DAVID LAURENIU
INTRODUCERE
- piaa unui ter (3rd party marketplace): se apeleaz la o interfa utilizator pentru catalogul de
produse al companiei, interfa ce aparine unui ter (n general, furnizor de servicii internet sau o
banc). Aceast metod are avantajul c interfaa este unic pentru mai muli productori,
utilizatorii fiind familiarizai cu utilizarea ei
- comuniti virtuale (virtual communities): valoarea cea mai important a unei comuniti
virtuale este dat de ctre membrii si (clieni sau parteneri), care adaug informaii proprii peste
un mediu de baz furnizat de companie. Fiecare membru poate oferi spre vnzare produse sau
servicii sau poate adresa cereri de cumprare a unor produse sau servicii. Calitatea de membru al
unei comuniti virtuale presupune plata unei taxe.
- furnizor de servicii cu valoare adugat pentru canalele de comer electronic (value chain
service provider): furnizorii de servicii sunt specializai pe funcii specifice, cum ar fi asigurarea
logisticii, plata electronic sau expertiza n managementul produciei i a stocurilor. Plata acestor
servicii se face pe baza unor tarife sau a unei cote procentuale.
- platforme de colaborare: platformele de colaborare cuprind un set de instrumente i un mediu
informaional pentru colaborarea ntre companii. Acestea pot adresa funcii specifice, cum ar fi
concepia sau proiectarea n colaborare. Ctigurile provin din managementul platformei (taxa de
membru sau taxa de utilizare), i din vnzri de instrumente specializate (pentru design,
workflow i gestiunea de documente). Prin workflow se nelege fluxul de documente, care
implic dou entiti: partea pasiv (documentele) i partea activ (deplasarea acestor
documente).
- brokeraj de informaii i alte servicii: exemplele cuprind cataloage de clieni clasificai pe
profil, vnzarea de oportuniti de afaceri, consultan n domenii specializate. O categorie
special o constituie serviciile de ncredere furnizate de autoritile de certificare sau de
notariatele electronice.
Un sistem electronic de pli se refer la totalitatea obiectelor care conlucreaz pentru
10
DAVID LAURENIU
INTRODUCERE
asigurarea plii tranzaciilor ce se efectueaz. Sunt implicate, n general, trei entiti care
interacioneaz: o banca B, un cumprtor C i un vnztor V. Sistemul electronic de pli
conine i o mulime de protocoale care permit cumprtorului C s fac pli ctre vnztorul V.
Sistemele electronice de pli pot fi privite ntr-o structur ierarhic pe nivele, derivate din
arhitectura sistemelor ISO-OSI .
Un Sistem Electronic de Pli (Fig. 1.3) este format din doua nivele:
- nivelul utilizator, care constituie nivelul ierarhic superior;
11
DAVID LAURENIU
INTRODUCERE
Nivelul utilizator const din mulimea utilizatorilor i a tranzaciilor care au loc ntre acetia.
Utilizatorii sunt grupai dup diverse roluri, dup modul n care interacioneaz n relaiile de
afaceri dintre ei: cumprtorul, vnztorul, emitentul de bani electronici (banca), etc.
Nivelul sistem: const din mulimea entitilor fizice i a relaiilor care se stabilesc ntre ele.
Entitile pot juca unul dintre urmtoarele roluri: purttor de bani electronici sau registru de cas.
De-a lungul ultimilor ani, Comerul Electronic a devenit o activitate comun pentru multe
companii. Unele dintre acestea au acceptat aceast provocare, fr a lua n considerare
schimbrile culturale pe care le implic situaia n cauz, precum i infrastructura necesar pentru
a continua proiectul iniial.
Pentru a ncepe dezvoltarea unei afaceri n lumea electronic, exist unele puncte care trebuie
s fie acoperite. n primul rnd este necesar s se stabileasc o strategie de marketing, pentru a
crea un catalog de produse, pentru a defini costurile i preurile de vnzare, piaa int, preurile
de transport i de manipulare.
n prezent, majoritatea companiilor doresc s includ dezvoltarea E-Business. Aceast nou
tehnologie, care se bazeaz pe Internet, este i va rmne pentru o lung perioad de timp o
variant de dezvoltare a unei afaceri. Pentru a putea utiliza aceast tehnologie ntr-un mod
corespunztor, este necesar s se bazeze pe o bun organizare a informaiilor i proceselor.
Aceasta este o provocare, datorit faptului c cele mai multe companii nu au propriile lor sisteme
care s ofere sprijin pentru a rezolva nevoile specifice. Pentru a realiza o dezvoltare
corespunztoare a acestui proiect este nevoie de o companie care are personal calificat.
12
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Internetul s-a nscut la mijlocul anilor 60 n forma ARPAnet (Advanced Research Projects
Agency Net) - o reea ntre mai multe computere din unele instituii americane, ce lucrau pentru
ARPA, un departament de cercetare din cadrul Pentagonului. ARPA a fost pus n funciune ca
reacie la succesul sovietic al lansrii satelitului Sputnik n spaiu n 1957. Unul din obiectivele
ARPAnet era crearea unei reele, care s nu fie distrus datorit atacurilor asupra sistemului.
Rzboiul Rece fiind la apogeu, scenariul unui dezastru era considerat fie lansarea unei bombe fie
un atac nuclear.
De aici a rezultat un proiect de reea, unde reeaua nsi era permanent n pericol de atac. n
consecin:- doar un minimum de informaii era cerut de la computerele client n reea - oricnd
transmisia de date ntlnea un obstacol, sau una dintre adrese era de negsit, se gsea o alt cale
ctre adresa cutat.
Toate acestea au fost codificate ntr-un protocol care reglementa transmisia de date pe Internet.
n forma sa final, acesta era TCP/IP (Transmission Control Protocol / Internet protocol), care
este i acum baza Internetului. TCP/IP face posibil ca modele diferite de calculatoare, de
exemplu IBM compatibile sau Mac's, folosind sisteme diferite sisteme de operare, cum ar fi
UNIX, Windows, MacOS etc. S se "neleag" unele cu altele. n acest fel, internetul era i este
cu adevrat o platform independent.
Internet-ul "civil" a nceput ca o reea de patru computere ntre Universitile din Utah, Santa
Barbara i Los Angeles i Institutul de Cercetare din Stanford. n curnd, cercettori din alte
instituii de stat au devenit interesai. Deoarece folosirea computerelor era costisitoare, ei au
vzut imediat avantajele folosirii n comun a unei reele.
La sfritul anilor 60 i nceputul anilor 70, cnd Internetul numra n jur de 50 de computere,
13
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
s-au dezvoltat primele dintre servicii, folosite nc i azi pentru transferul informaiei:- File
Transfer Protocol pentru trimiterea i regsirea fiierelor - Telnet pentru accesarea i folosirea
bazelor de date, a bibliotecilor i a cataloagelor din toat lumea - E-Mail pentru trimiterea
mesajelor personale.
Internetul era n mod categoric n ascenden. Cu noi grupuri de utilizatori care se alturau, n
urmtoarea decad, Internetul a crescut la o reea de 200 de computere. Partea militar era
organizat ntr-o reea separat, Milnet.
n acelai timp, au aprut alte reele, mai ales n sectorul academic. Important printre acestea
era (i este) USENET sau Users' Network, care a nceput n 1979, cnd cteva computere UNIX
au fost conectate mpreun.
USENET. n sute de grupuri de discuii despre orice subiect imaginabil, oamenii fceau schimb
de nouti i imagini, n ciuda distanelor i a hotarelor. Alte reele s-au dezvoltat de-a lungul
USENETului. Toate formau baza unui spaiu de comunicaie radical democratic. De exemplu,
naintea unei noi discuii pe care grupul o ncepea, comunitii Netului i se cerea un vot de
accept. Grupurile de discuii joac nc un rol mare pe Internet. Exist mii i zeci de mii n ntreg
internetul.
Alt motenire a USENET este "Netiquette", sau regulile de comportament pe Internet.
10 ani dup ce USENET i ncepuse dezvoltarea, Internetul a crescut la 80.000 de computere.
A nceput s fie un factor de luat n considerare n politic. i curnd, expresia "Information
SuperHighway" (autostrada informaiei) a devenit uzual. n aceast metafor, Internetul era
vzut ca o important infrastructur pentru transportul unor bunuri vitale - informaiile.
n anii 80 i nceputul anilor 90, cnd Internetul era folosit doar de un numr mic de cercettori,
arata mult diferit fa de prezent. Principalele aplicaii erau atunci pota electronic i grupurile
de discuii (Newsgroups) plus diverse rutine de cutare i mecanisme de transfer al fiierelor.
Aceasta era o lume UNIX, n care toate comunicaiile existau doar ca text sau numere, i liniile
de comand trebuiau memorate i tiprite.
Era destinat s fie o platform intern de comunicaii pentru cercettorii din ntreaga lume care
lucrau pentru CERN. Sarcina principal era s asigure un sistem care s fac legtura ntre
14
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
n Romnia, penetrarea internetului a crescut constant n ultimii ani, atingnd 53% la nivel
naional i 63% la nivel urban n rndul persoanelor cu vrsta de peste 15 ani n aprilie 2013. n
acelai timp, apetitul romnilor pentru tablete i smartphone-uri este n continu cretere.
Vnzrile au cunoscut o important tendin ascendent n ultimii ani, smartphone-urile
15
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
ajungnd la o pondere de 25% din totalul pieei de telefoane mobile n uniti n 2012, iar
numrul de tablete vndute a crescut de aproape 5 ori n 2012 fa de 2011.
Aceste evoluii ncep s i pun amprenta nu doar asupra stilului de via al consumatorilor, ci
i asupra comportamentului lor de cumprare. Dac pn nu de mult magazinele i mediile
tradiionale de comunicare erau principalele surse de informare n vederea lurii deciziei de
cumprare, n prezent internetul este utilizat pe scar larg.
Un studiu desfurat de GfK Romnia pe un eantion reprezentativ pentru populaia urban
utilizatoare de Internet, cu vrste ntre 15 i 45 de ani, relev rolul important al internetului n
redefinirea comportamentului de cumprare. 70% dintre cei chestionai declar c Internetul a
devenit un instrument de cumprare foarte util, iar 44% menioneaz c reelele sociale au
devenit la fel de importante ca i alte surse de informaii pentru a face cele mai bune alegeri de
produse.
Accesarea site-urilor de comparare a preurilor, consultarea online a descrierilor detaliate ale
produselor i a recenziilor altor cumprtori, schimbul de informaii din reelele sociale, toate
acestea sunt activiti desfurate din ce n ce mai mult n vederea lurii celei mai bune decizii de
cumprare, care s aduc cea mai mare valoare cumprtorului. Astfel, accesul la surse multiple
de informare ne transform pe toi n cumprtori mult mai implicai i mai exigeni, mai dificil
de mulumit dect nainte, spune Raluca Rschip, Consumer Goods & Retail Director GfK
Romnia.
n afar de mediul online, treptat se dezvolt i alte medii de interaciune, cum ar fi cel prin
intermediul smartphone-urilor. Dac n momentul de fa smartphone-ul este folosit cu precdere
pentru a compara preuri (44% dintre deintorii care s-au informat online sau au cumprat
online n ultimele 6 luni), pentru a cuta informaii i recenzii (42%) i pentru a localiza
magazine (42%), i alte tipuri de comportamente ncep s apar: verificarea disponibilitii unui
produs (31%) sau scanarea de coduri QR (22%).
16
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
n acest mediu n care cumprtorul este mult mai contient de instrumentele pe care le are la
ndemn i mai implicat n procesul de cumprare, utiliznd tot mai multe prghii pentru a
maximiza valoarea pe care o obine, devine tot mai dificil pentru productori i pentru retaileri s
pstreze un nivel de loialitate ridicat.
De aceea, cunoaterea modului n care cumprtorii se informeaz i folosesc noile tehnologii,
a diversitii stimulilor cu care acetia intr n contact n procesul de cumprare, devine din ce n
ce mai important pentru asigurarea succesului pe pia, nu doar pentru a rspunde nevoilor
actuale ale cumprtorilor, ci i pentru a anticipa nevoi viitoare ntr-un peisaj din ce n ce mai
digitalizat.
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
multiple documente sau chiar in interiorul aceluiai document. Structurarea riguroasa a
documentelor permite convertirea acestora dintr-un format in altul precum si interogarea unor
baze de date formate din aceste documente.
Standardul oficial HTML este World Wide Web Consortium (W3C), care este afiliat la Internet
Engineering Task Force (IETF). W3C a enunat cteva versiuni ale specificaiei HTML, printre
care si HTML 2.0, HTML 3.0, HTML 3.2, HTML 4.0 si, cel mai recent, HTML 4.01. In acelai
timp, autorii de browsere, cum ar fi Netscape si Microsoft, au dezvoltat adesea propriile
"extensii" HTML in afara procesului standard si le-au incorporat in browserele lor. In unele
cazuri, cum ar fi tagul Netscape , aceste extensii au devenit standarde de facto adoptate de autorii
de browsere.
HTML 2.0, elaborat in Iunie 1994, este standardul pe care ar trebui sa-l suporte toate
browserele curente -- inclusiv cele mod text. HTML 2.0 reflecta concepia originala a HTML ca
un limbaj de marcare independent de obiectele existente pentru aezarea lor in pagina, in loc de a
specifica exact cum ar trebui sa arate acestea. Dac dorii sa fii siguri ca toi vizitatorii vor vedea
paginile aa cum trebuie, folosii tagurile HTML 2.0.
Specificaia HTML 3.0, Enunata in 1995, a ncercat sa dezvolte HTML 2.0 prin adugarea
unor faciliti precum tabelele si un mai mare control asupra textului din jurul imaginilor. Dei
unele din noutile HTML 3.0 erau deja folosite de autorii de browsere, multe nu erau nc. In
unele cazuri, taguri asemntoare implementate de autorii de browsere au devenit mai rspndite
dect tagurile "oficiale". Specificaia HTML 3.0 acum a expirat, deci nu mai este un standard
oficial.
In Mai 1996, W3C a scos pe piaa specificaia HTML 3.2, care era proiectata sa reflecte si sa
standardizeze practicile acceptate la scara larga. Deci, HTML 3.2 include tagurile HTML 3.0 ce
erau adoptate de autorii de browsere ca Netscape si Microsoft plus extensii HTML rspndite. In
Bilanul asupra HTML, W3C recomanda ca providerii de informaii sa utilizeze specificaia
HTML 3.2.Versiunile curente ale majoritii browserelor ar trebui sa suporte toate, sau aproape
18
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
propriu-zis al paginii HTML, adic ceea ce va fi afiat in fereastra browser-ului.
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
<script> - pentru a face referire la fisiere javascript folosite pentru a da dinaminictate paginii,
<link> - folosit pentru a face referire la fisiere css
documentului.
In general, documentul va avea urmatoarea structura a elementelor coninute in tagul <head>:
<html>
<head>
<title> Titlul paginii </title>
<script src=dinamism.js></script>
<link rel=stylesheet type=text./css href=stil.css >
</head>
<body>
</body>
</html>
Tagul <body> conine corpul documentului. Practic, in acest tag rezida toate elementele ce vor
fi afiate direct ctre utilizator. Pentru a structtura o pagina web cat mai eficient se folosete tagul
<div> ce marcheaz o poriune din document ale crei mrimi pot fi setate fie din interiorul
fiierului css sau aplicand atributele width si height acestui document.
Un exemplu practic de utilizare a tagului <div> este crearea unui meniu de navigare. Folosind
tagul <div> ntregul meniu va fi privit ca o singura entitate. Aceasta este structura unui fisier
HTML ce conine un meniu de navigare minimalist implementat prin intermediul tagului <div>.
<!DOCTYPE html>
<html>
<head>
<title> Titlul paginii </title>
<script src=dinamism.js></script>
21
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
CSS (Cascading Style Sheets) este un standard pentru formatarea elementelor unui document
HTML. Stilurile se pot ataa elementelor HTML prin intermediul unor fi iere externe sau n
cadrul documentului, prin elementul <style> i/sau atributul style.
Pentru a personaliza aspectul unui element dintr-un fisier HTML prin intermediu css este
necesara o modalitate de a face referire la acele elemente din interiorul unui fisier css. De obicei,
se folosesc atributede id si class ale unui tag html pentru a se face referire la el dintr-un fisier
css.
22
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
n exemplul urmtor modficm mrimea fontului unui paragraf si culoarea acestuia prin
intermediul unui fisser css.
#paragraf {
font-size: 23px;
font-color: blue;
}
Acesta este fiierul html asupra caruia aplicm stilul definit in interiorul fiierului css.
<!DOCYPE html>
<html>
<head>
<link rel=stylesheet type=text/css href=stil.css>
</head>
<body>
<p id=paragraf>
Acesta este un paragraf.
</p>
</boody>
</html>
Este demn de precizat ca este nevoie sa precedem id-ul elementului cu un # atunci cand dorim sa
facem referire la un element dupa id-ul acestuia.
O alta caracteristic des folosita a fiierelor css este poziionarea unui element. Bazndu-ne pe
acelai principiu expus n exemplul anterior putem poziiona un element dupa bunul plac
folosind atributele left, right, botton si top.
23
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
In exemplul urmtor vom poziiona o imagine la 200px de partea din stanga a paginii si 200px
de partea din dreapta a paginii.
.imagine {
left: 200px;
top: 200px;
position: absolute;
}
Aceasta este structura fiierului html asupra cruia am aplicat stilurile definite in fisierul css
expus mai sus.
<!DOCTYPE html>
<html>
<head>
<link rel=stylesheet type=text/css href=stil.css>
</head>
<body>
<img src=imagine.png class=imagine>
</body>
</html>
Dupa cu observati, de aceasta data am folosit atributul class al tagului <img> pentru a face
referire la acesta din interiorul fiierului css. De asemenea, se poate observa ca n interiorul
fiierului css am prefixat clasa imaginii cu un punct, acesta fiind modul prin care selectam un
element in funcie de valoarea atributului class.
Dei nu foarte folosit n pactic, exista o a doua modalitate de a personaliza un fisier html prin
intermediul css fara a face referire la resurse externe. Pentru aceasta va trebui sa utilizam tagul
24
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
JavaScript (JS) este un limbaj de programare orientat obiect bazat pe conceptul prototipurilor.
Este folosit mai ales pentru introducerea unor funcionaliti n paginile web, codul Javascript
din aceste pagini fiind rulat de ctre browser. Limbajul este binecunoscut pentru folosirea sa n
construirea siturilor web, dar este folosit i pentru accesul la obiecte ncastrate (embedded
objects) n alte aplicaii. A fost dezvoltat ini ial de ctre Brendan Eich de la Netscape
25
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Communications Corporation sub numele de Mocha, apoi LiveScript, i denumit n final
JavaScript.
n ciuda numelui i a unor similariti n sintax, ntre JavaScript i limbajul Java nu exist
nicio legtur. Ca i Java, JavaScript are o sintax apropiat de cea a limbajului C, dar are mai
multe n comun cu limbajul Self dect cu Java.
Codul scris in acest limbaj este introdus direct in interiorul fisierului HTML prin intermediul
tagului <script> sau se poate face referire la un fisier JavaScript prin intermediul atributului src
al tagului <script>. Prima variant este cea mai des ntalnit ntruct este ideala pentru scripturi
de dimensiuni mici, ce nu depasesc 200-250 de linii de cod. n mod normal, aa va arata un fisier
HTML ce conine si cod JavaScript:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script type=text/javascript>
alert('alerta in javascript');
</script>
</body>
</html>
n exemplul de mai sus am folosit funcia alert pentru a demonstra modul de funcionare a unui
program simplu in JavaScript.
Definirea variabilelor
26
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
In JavaScript, precum si n alte limbaje de scripting, nu este necesar declararea tipului de date
atunci cand definim o noua variabil sau funcie. Totui, definirea unei noi variabile se face
folosindu-ne de cuvntul cheie var, nu puteam pur i simplu sa folosim acea variabila fara sa o fi
declarat.
Exemplu de definire a variabilelor in limbajul JavaScript:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script type=text/javascript>
var a = 1;
a = string cu doua ghilimele;
a = 'string cu apostroafe';
a = 2.3;
</script>
</body>
</html>
n exemplul de mai sus am creat o variabila a i i-am am atribuit pe rand 4 valori de tip: intreg,
string, string delimitat de apostroafe i numr real. Precum majoritatea limbajelor de scripting,
JavaScript, pune la dispoziie dou modaliti sintactice de reprezentare a stringurilor: forma ce
face uz de ghilimele i forma ce folosete apostroafele.
27
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Din punct de vedere al structurilor decizionale JavaScript se aseamn foarte mult cu limbajele
C, C++ si Java. Exemplul urmator demostraza modul de folosire a celor mai frecvente structuri
decizionale, i anume: if/else/elseif i switch.
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script type=text/javascript>
if(true) {
alert('ramura de adevar');
}
else if(undefined) {
alert('ramura elseif');
}
else {
alert('ramura else');
}
switch(variabila) {
case true:
alert('cazul de adevar');
break;
default:
alert('nicio ramura nu a fost acoperita');
}
</script>
</body>
28
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
</html>
n exemplul de mai sus am introdus o strucura decizional de tip if/elseif/else ce apeleaza
funcia alert, pasndu-i ca i argumente stringurile: 'ramura de adevar', 'ramura elseif',
'ramura else', n funcie de ramura pe care se afla fluxul de execuie.
n cazul celui de al doilea exemplu, n care folosim structura switch, vom apela funcia alert
pasndu-i ca i argument stringul 'cazul de adevar', atunci cand fluxul de executie se afla in
cazul in care valoarea variabilei variabila este true.
Structuri repetitive
Precum i in limbajul de programare C, limbajul JavaScript pune la dispozitie 3 structuri
repetitive principale: do/while, while, for.
n exemplul urmator voi prezenta fiecare din cele 3 structuri repetitive:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script type=text/javascript>
do {
alert(i);
i++;
} while(i < 10);
while(i > 8) {
alert(i);
29
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
i--;
}
for(var i = 0; i < 20; i++) {
alert(i);
}
</script>
</body>
</html>
Bucla do/while va rula pana cand valoarea varieabilei i va fi mai mare decat 10, la fiecare iteraie
se afieaz valoarea variabilei i i se incrementeaz cu o unitate.
Bucla while va rula pan cnd valoarea ei va fi mai mica de 8, la fiecare itera ie a buclei se va
afia valoarea variabilei prin intermediul functiei alert, iar valoarea variabilei i va fi
decrementat cu o unitate.
Bucla for va rula pn cnd valoarea variabilei i va fi mai mare de 20, la fiecare iteraie a buclei
valoarea variabilei va fi incrementata cu o unitate, iar valoarea acesteia va fi afiat ntr-o csu a
de dialog prin intermediul funciei alert.
Definirea functiilor
Limbajul JavaScript pune la dispoziie doua modaliti de definire a func iilor, prima
asemnndu-se foarte mult cu modul de definire a funciilor din limbajul php. Exemplul urmtor
ilustreaza modul de utilizare a celor doua modaliti.
<!DOCTYPE html>
30
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
<html>
<head>
</head>
<body>
<script type=text/javascript>
function f() {
alert('f');
}
var g = function() {
alert('g');
}
</script>
</body>
</html>
Prima modalitate definete o funcie f ce va afia o casu de dialog cu textul f atunci cand este
apelat, iar a doua definete o variabila g caruia i este atribuit valoarea unei funcii anonime ce
afieaz o casuta de dialog cu textul g.
Pentru a prelucra elementele DOM-ului prin intermediul JavaScript simplu vom ntampina o
serie de dificultati, ntrucat funciile folosite pentru realizarea acestor lucruri sunt implementate
diferit de producatorii de browsere, iar API-ul nativ pus la dispozitie de un browser pentru
efectuarea acestui lucru ofera o interfata neprietenoasa. Pentru a usura procesul de selectare si
modificare a elementelor DOM-ului vom folosi o biblioteca denumita JQuery.
Selectarea elementelor dupa id
31
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Pentru a modifica elementele unui document HTML este nevoie de o modalitate de a le accesa,
interfata pus la dispoziie de JQuery se aseman foarte mult cu modul n care selectm
elementele HTML din limbajul CSS. n exemplul urmator voi selecta tagul <p> cu id-ul
paragraf si voi adauga in interiorul acestuia textul text.
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script type=text/javascript>
$(document).ready(function() {
$('#paragraf').append('text');
});
</script>
<div>
<p id=paragraf> </p>
</div>
</body>
</html>
Se observa apelul la metoda ready a documentului, scopul acestei aciuni este de a executa cod
JavaScript decat dupa ce browserul a terminat de incrcat pagina complet. Folosind metoda
append aplicata asupra elementului cu id-ul paragraf vom adauga textul text n interiorul
acestui element.
Tratarea evenimentelor
32
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
JQuery ne permite s legm diferite evenimente de elemente din fisierul HTML. Spre
exemplu, atunci cnd se face click pe un buton va fi apelat evenimentul click. JQuery ne permite
s executam poriuni de cod la executarea unui astfel de eveniment.
In exemplul de mai jos voi afisa o casuta de dialog de fiecare data cand se face click pe un
buton ce are atributul class egal cu buton.
<!DOCTYPE html>
<html>
<head></head>
<body>
<script type=text/javascript>
$('.buton').click(function() {
alert('ati apasat butonul');
});
</script>
<div>
<button type=button class=buton> Buton </button>
</div>
</body>
</html>
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
baz a acestuia, CPython, scris n C. Python este un limbaj multifunc ional folosit de exemplu
de ctre companii ca Google sau Yahoo pentru programarea aplicaiilor web, ns exist i o serie
de aplicaii tiinifice sau de divertisment programate parial sau n ntregime n Python.
Popularitatea n cretere, dar i puterea limbajului de programare Python au dus la adoptarea sa
ca limbaj principal de dezvoltare de ctre programatori specializai i chiar i la predarea
limbajului n unele medii universitare. Din aceleai motive, multe sisteme bazate pe Unix,
inclusiv Linux, BSD i Mac OS X includ din start interpretatorul CPython.
Python pune accentul pe curenia i simplitatea codului, iar sintaxa sa le permite
dezvoltatorilor s exprime unele idei programatice ntr-o manier mai clar i mai concis dect
n alte limbaje de programare ca C. n ceea ce privete paradigma de programare, Python poate
servi ca limbaj pentru software de tipul object-oriented, dar permite i programarea imperativ,
funcional sau procedural. Sistemul de tipizare este dinamic iar administrarea memoriei
decurge automat prin intermediul unui serviciu gunoier (garbage collector). Alt avantaj al
limbajului este existena unei ample biblioteci standard de metode.
Implementarea de referin a Python este scris n C i poart deci numele de CPython. Aceast
implementare este software liber i este administrat de fundaia Python Software Foundation.
Tipizare
Limbajele dinamice sunt deseori caracterizate prin tipizare dinamic, sunt interpretate, au
management de memorie automatizat (garbage collecting) i au un nivel nalt de abstractizare.
Tipul variabilelor nu este fixat la momentul declarrii acestora (de fapt, declararea variabilelor
nu este necesar ca n C), ci este determinat de interpretator dup coninutul lor sau dup
operaiile efectuate. ntr-un asemenea caz se vorbete de tipizare dinamic.
Avantajul acestei metode de a lucra cu tipuri este c codul produs este mai clar i mai intuitiv. De
exemplu
34
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Stil
Python este un limbaj multi-paradigm, concentrndu-se asupra programrii imperative,
orientate pe obiecte i funcionale, ceea ce permite o flexibilitate mai mare n scrierea aplicaiilor.
Din punctul de vedere al sintaxei, Python are un numr de contrucii i cuvinte cheie cunoscute
oricrui programator, dar prezint i un concept unic: nivelul de indentare are semnifica ie
sintactic. Blocurile de cod sunt delimitate prin simpl indentare.
n C un astfel de blocuri sunt deseori desemnte prin acolade, {<cod>}, dar n Python nu este
nevoie de astfel de construcii. Nivelele de indentare ndeplinesc aceast funcie. Aceast
importan a indentrii este foarte suprinztoare pentru muli utilizatori noi ai limbajului Python,
chiar dac sunt programatori cu experien. Dar o astfel de utilizare a indentrii permite codului
s fie mai uor de citit i mai compact. Programatorii cu experien vor indenta implicit codul
surs, oricare ar fi limbajul, fiindc astfel se permite structurarea codului surs i eviden ierea
36
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
funcionalitii. Python face din aceast deprindere folositoare n acest sens o cerin strict.
O impunere similar exist i n limbajul de programare Java, care for eaz programatorii s
delimiteze clasele n fiiere aparte, din motive de organizare i sporire a eficien ei de scriere a
softului n echipe.
Biblioteci i Extindere
Includerea tuturor acestor structuri, precum i a funciilor ce permit manipularea i prelucrarea
lor, precum i multe alte biblioteci de funcii sunt prezente datorit conceptului Batteries
Included, ce poate fi explicat prin faptul c Guido van Rossum i comunitatea ce s-a format n
jurul limbajului cred c un limbaj de programare nu prezint utilitate practic dac nu are un set
de biblioteci importante pentru majoritatea dezvoltatorilor.
Din acest motiv Python include bibioteci pentru lucrul cu fiiere, arhive, fiiere XML i un set
de biblioteci pentru lucrul cu reeaua i principalele protocoale de comunicare pe internet (HTTP,
Telnet, FTP). Un numr mare de platforme Web sunt construite cu Python. Abilit ile limbajului
ca limbaj pentru programarea CGI sunt n afara oricror dubii. De exemplu YouTube, unul din
site-urile cu cea mai ampl cantitate de trafic din lume, este construit pe baza limbajului Python.
Totui, Python permite extinderea funcionalitii prin pachete adiionale programate de teri
care sunt axate pe o anumit funcionalitate. De pild, pachetul wxPython con ine metodele i
structurile necesare crerii unei interfee grafice.
Popularitatea limbajului este n cretere ncepnd cu anul 2000, datorit faptului c Python
permite crearea mai rapid a aplicaiilor care nu cer viteze nalte de procesare a datelor. De
asemenea este util ca limbaj de scriptare, utilizat n cadrul aplica iilor scrise n alte limbaje.
Modulele (bibliotecile) Python pot fi de asemenea scrise n C, compilate i importate n Python
pentru a mri viteza de procesare.
37
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Spre deosebire de PHP, Python nu ofer suport direct pentru dezvoltarea aplicaiilor web,
pentru a dezvolta aplicaii web in python este necesar un framework web ce va pune la
dispozitie toate funciile i dependinele necesare dezvoltrii unei aplicaii web.
Elementele de baza puse la dispozitie de Flask sunt: serverul web folosit pentru efectuarea
testelor, template engine-ul si o bibliotec vasta de funcii uzuale n dezvoltarea unei aplicatii
web.
app = Flask(__name__)
@app.route('/index')
def index():
return render_template('index.html')
Dupa cum vedei, este necesar importarea clasei Flask i a funciei render_template.
Variabila app va fi iniializat drep un obiect de tip Flask, acest obiect va conine toate datele ce
in de configurarea aplicatiei.
38
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Functia render_template va procesa templateul al crui nume i este pasat ca i argument si va
returna sub forma unui string coninutul acestuia. Motivul folosirii unei astfel de metode este
pentru a permite utilizarea structurilor de control ce permit crearea templateurilor ntr-un mod
dinamic.
Folosind decoratorul app.route nregistram funcia index drept un view. Astfel, funcia index
va fi apelat de fiecare dat cand un client solicit resursa /index.
Pentru a procesa templateurile intr-un mod dinamic este necesar folosirea unui template
engine ce implementeaza structuri de control de baza. Template engineul folosit de flask se
39
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
numeste Jinja2 i pune la dispoziie majoritatea structurilor de control ntlnite n limbajul
Python, asemnndu-se foarte mult si din punct de vedere sintactic.
Exemplul urmtor ilustreaza un template ce genereaza in mod dinamic o list HTML iternd
elementele dintr-o lista, pentru o mai buna ntelegere am inclus i codul responsabil cu servirea
cererilor.
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/lista')
lista = [1, 2, 3]
return render_template('lista.html', lista=lista)
Acesta este templateul
<!DOCTYPE html>
<html>
<head></head>
<body>
<ol>
{% for element in lista %}
<li> {{ element }} </li>
{% endfor %}
</ol>
</body>
</html>
40
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Dupa cum se poate observa stuctura for folosit n template engine se aseaman foarte mult cu
cea folosit n limbajul Python. Demn de men ionat este si faptul c strucurile de control sunt
scrise n interiorul elementelor {% i %}, iar atunci cnd dorim sa accesm valoarea unui obiect
vom scrie numele acestuia intre elementele {{ i }}.
class Utilizator(db.Model)
id = db.Column(db.Integer, primary_key=True)
nume = db.Column(db.String, nullable=False)
prenume = db.Column(db.String, nullable=False)
parola = db.Column(db.Srtring, nullable=False)
41
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
Dup cum se poate vedea, definim o clasa denumita Utilizator ce motenete clasa db.Model.
Clasa Utilizator contine urmatoarele atribute: id contine o instanta a clasei db.Column create
pentru un cmp de tip ntreg ce este i cheie primar, nume ce contine o instan a clasei
db.Column iniializat pentru un camp de tip string a crui valoare nu poate fi nul, prenume ce conine o instana a clasei db.Column iniializat pentru un camp de tip string ce nu poate
conine o valoare nul, parola conine o instan a clasei db.Column iniializat pentru un
element de tip string ce nu poate conine o valoare nula.
Un alt avanatj al SQLAlchemy este faptul c nu constrnge utilizatorul la folosirea unui anumit
sistem de management al bazelor de date. In general, utilizatorii SQLAlchemy folosesc
PostgreSQL.
Executarea interogarilor
Avand in vedere faptul ca clasele ce motenesc clasa db.Model sunt reprezentarile tabelelor din
baza de date, acestea conin i metode speciale folosite pentru a efectua interogari.
Exemplul urmtor demonstreaza cele mai frecvent utilizate meode pentru efectuarea unei
interogri:
utilizatori = Utilizator.query.all()
george = Utilizator.query.filter_by(name='geroge').first()
utilizatorul1 = Utilizator.query.get(1)
42
DAVID LAURENIU
ROLUL I IMPORTANA
INTERNETULUI I A
PAGINILORWEB
n primul exemplu atribuim variabilei utilizatori o lista ce va conie toate obiectele de tip
Utilizator din baza de date.
n al doilea exemplu atribuim variabilei george ca i valoare obiectul returnat de efectuarea unei
interogri dup cmpul nume.
n al treilea exemplu atribuim vaiabilei utilizatorul1 valorea returnat de interogarea efectuata
cu scopul de a obine elementul cu id-ul 1.
Pentru a aduga informaii noi n baza de date va trebui sa adugam obiectul modificat sau nou
creat in sesiunea pusa la dispozitie de SQLALchemy dupa ce am terminat de adaugat elementele
noi sau modificate n sesiune va trebui sa confirmm schimbarea.
Exemplul urmtor ilustreaza introducerea unui nou utilizator n baza de date
43
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
Magazinul web creat in cadrul lucrrii de licenta este unul ce se axeaza pe o gam cat mai larga
de produse, oferind suport pentru o varietate de produse din diverse categorii. Pagina web este
mprit in 3 zone: bara de navigare, zona de coninut si subsolul paginii.
Bara de navigare prezentat in figura 3.1 cuprinde: numele magazinului online numele fiind
un link la pagina de index, butonul de acas, butonul pentru pagina de contact, butonul ce
afieaz meniul cu categoriile disponibile, casua de cutare i butoanele de ieire din cont i de
interogare a cosului.
Zona de coninut difer n funcie de pagina pe care se afla utilizatorul. Spre exemplu, pe pagina
de cos se vor afisa elementele aflate in cos, valoarea acestora si meoda de plata.
44
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
Zona de subsol conine o bar de navigare ce cuprinde numele creatorului magazinului web
45
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
46
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
47
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
48
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
Pagina de cutare, va conine toate rezultatele cutrii efectuate prin intermediul csuei de
cutare coninut n meniul de navigare. Rezultatele cautarii vor fi structurate astfel: poza
produsului cu link la pagina produsului, descrierea prosului, preul acestuia si disponibilitatea
produsului.
49
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
50
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
51
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
Pagina de co, va conine toate produsele aflate n co la momentul accesrii paginii i va oferi
utilizatorului posibilitatea s modifice cantitatea cumprat din acel produs, s tearg produsul,
s vizualizeze n timp real costul acelui produs i costul ntregii tranzacii. Dup ce utilizatorul
i-a setat cantitatea dorit dintr-un anumit produs i a selectat i metoda de cumprare, va trebui
s introduc datele de transport, iar un email cu factura va fi trimis.
52
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
53
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
Pe partea de server, aplicaia este mparit n 21 de rute menite sa deserveasca fiecare dintre
paginile prezentate mai sus, att si apelurile efectuate prin AJAX pentru a nu mai fi necesar
rencarcarea paginii.
Demn de prezentat sunt urmatoarele rute:
Ruta pentru pagina de index, trimite uilizatorului pagina de index pasnd funciei
render_template i o lista cu cele mai noi 3 produse in baza de date.
@app.route('/')
@app.route('/index')
def index():
promotionalProducts = Product.query.paginate(1, 3, False)
return render_template('index.html',
promotionalProducts=promotionalProducts)
Ruta pentru pagina de contact, i va returna utilizatorului pagina de contact dac acesta o
acceseaz pentru prima dat sau dac formularul completat de acesta este unul invalid. Dac
formularul completat de utilizator este unul valid, atunci se va realiza un apel la functia
sendMail pentru a-i trimite un email cu mesajul utilizatorului administratorului siteului. Func ia
sendMail este implementata in interiorul fiierului helper.py i este o interfa mult mai
54
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
accesibil a extensiei flask-mail ce necesit o cantitate mult mai mare de cod pentru transmiterea
unui mail. De asemenea, se poate observa ca funcia render_template este folosit pentru
generarea templaterurilor pentru mailuri, astfel putem scrie intr-un fisier HTML ablonul pentru
un email.
@app.route('/contact', methods=['GET', 'POST'])
def contact():
form = ContactForm()
if request.method == 'POST' and form.validate():
sendMail(subject='Conact',
sender=app.config['ADMINS'][0],
recipients=app.config['ADMINS'],
messageBody='-----',
messageHtmlBody=render_template('contact_mail.html',
email=form.email.data,
name=form.name.data,
message=form.message.data)
)
return render_template('message_send_successfully.html')
return render_template('contact.html', form=form)
Ruta pentru pagina de cutare, va returna templateul pentru pagina de cautare pasandu-i funciei
render_template ca i argument o lista de produse ce se potrivesc cu elementul cautat de
utilizator.
@app.route('/search', methods=['POST'])
def search():
products = Product.query.all()
productsToRender = []
for product in products:
55
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
if request.form["search"] in product.name:
productsToRender.append(product)
return render_template('search_page.html', products=productsToRender)
Ruta pentru pagina de inregistrare va verifica validitatea formularului de nregistrare completat
de catre utilizator i, n funcie de validitatea acestuia, va trimite un email cu codul de activare
sau l va ateniona pe utilizator s recompleteze corespunztor formularul.
@app.route('/singup', methods=['GET', 'POST'])
def singup():
form = SingupForm(request.form)
if request.method == 'POST' and form.validate():
newPendingUser = PendingUser(pendingId=str(uuid4()),
name=form.name.data,
username=form.username.data,
password=md5(form.password.data).hexdigest(),
email=form.email.data
)
db.session.add(newPendingUser)
db.session.commit()
mailUrl = generateUrl(
route=url_for('validateUser',
pendingUserId=newPendingUser.pendingId
),
hostname=request.host
)
sendMail(subject="Validation Mail",
56
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
sender=app.config['ADMINS'][0],
recipients=[newPendingUser.email],
messageBody=render_template("confirmation_mail_body.html",
confirmationLink=mailUrl
),
messageHtmlBody=render_template(
"confirmation_mail_html_body.html",
confirmationLink=mailUrl
)
)
57
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
@app.route('/validate/<pendingUserId>')
def validateUser(pendingUserId):
pendingUser = PendingUser.query.filter_by(pendingId=pendingUserId).first()
if pendingUser is None:
return render_template("invalid_activation_link.html")
user = User(name=pendingUser.name,
email=pendingUser.email,
password=pendingUser.password,
username=pendingUser.username
)
db.session.add(user)
db.session.delete(pendingUser)
db.session.commit()
return render_template("successfull_activation.html",
username=user.username
)
Ruta pentru pagina de login, va verifica validitatea formularului de login i, n funcie de acest
aspect, va decide daca utilizatorul va fi autentificat sau daca va fi redirec ionat spre pagina de
autentificare situaie n care se ajunge n momentul completrii incorecte a formularului de
autentificare.
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if request.method == "POST" and form.validate():
user = User.query.filter_by(username=form.username.data,
58
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
password=md5(form.password.data).hexdigest()
).first()
if not user is None:
login_user(user)
flash('Te-ai logat cu succes')
return redirect(url_for('index'))
else:
flash("Numele de utilizator sau parola nu sunt corecte!")
flashErrors(form.errors, flash)
return render_template("login.html",
form=form
Ruta pentru pagina de categorii, acesta rut va returna un template ce va conine toate produsele
dintr-o categorie suportat de magazin.
@app.route('/categories/<string:category>/<int:page>')
def categories(category, page):
products = Product.query.filter_by(category=category).paginate(page,
PRODUCTS_PER_PAGE, False
)
return render_template("products.html",
products=products
)
Ruta pentru pagina produsului, aceasta rut va reurna un template ce va contine toate datele
stocate in baza de date despre un anumit produs.
@app.route('/product_page/<int:productId>')
def productPage(productId=1):
product = Product.query.get(productId)
59
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
return render_template("product_page.html",
product=product
)
Ruta pentru pagina de co, aceasta rut va returna un template ce con ine toate produsele
coninute n co, dar i toate metodele de transport stocate n baza de date.
@app.route('/cart')
def cart():
form = AddressForm()
return render_template("products_in_cart.html",
cart=g.cart.getProductData(),
form=form
)
Ruta de updatare a coului, este folosit pentru a adauga un produs nou n co atunci cnd
apsm butonul de adugare n co. Aceast rut este folosit n apelurie AJAX pentru a nu mai
fi necesar rencrcarea paginii atunci cand se va face click pe butonul de adaugare n co.
@app.route('/update_cart', methods=['GET', 'POST'])
def updateCart():
g.cart.updateQuantity(int(request.form["id"]),
int(request.form["quantity"])
)
session["cart"] = g.cart.items
session.modified = True
app.save_session(session, make_response("dummy"))
product = Product.query.get(int(request.form["id"]))
return jsonify(total=product.price *
60
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
int(request.form["quantity"])
)
Ruta pentru verificare a disponibilitii unui produs, este folosit
updateaza cantitatea unui produs pentru a verifica daca cantitatea introdus de utilizator este n
concordan cu valoarea stocului acelui produs.
@app.route('/check_stock', methods=['GET', 'POST'])
def checkStock():
product = Product.query.get(int(request.form["id"]))
return jsonify(stock=product.stock)
Ruta responsabila cu calcularea valorii coului, este folosita pentru a spori securitatea i a evita
eventualele atacuri informatice realizate de utilizatorii ru voitori. Este mult mai sigur sa
calculm valoarea coului pe server dect s-i cerem browserului utilizatorului s o fac pentru
noi.
@app.route('/get_cart_total', methods=['GET', 'POST'])
def getCartTotal():
total=g.cart.getTotal()
return jsonify(total=round(total, 2))
Ruta pentru tergerea unui produs din co, folosit pentru a terge un produs din cos prin
intermediul AJAX.
@app.route('/delete_from_cart', methods=['POST'])
def deleteFromCart():
g.cart.deleteFromCart(int(request.form['id']))
session["cart"] = g.cart.items
return jsonify(status="ok")
61
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
Ruta pentru setarea metodei de transport, folosit pentru a selecta firma dorita pentru a transporta
produsul.
@app.route('/set_shipping_method', methods=['POST'])
def setShippingMethod():
for shippingMethod in g.shippingMethods:
if shippingMethod.name == request.form["name"]:
g.cart.updateShipping(shippingMethod.price)
session["shipping"]["price"] = g.cart.shipping
session["shipping"]["name"] = request.form["name"]
return jsonify(status="ok")
return jsonify(status="fail")
Ruta pentru obtinerea numelui firmei de transport, folosita pentru a menine valoarea firmei de
transport aleas de utilizator de fiecare dat cnd acesta prsete pagina.
@app.route('/get_shipping_method', methods=["POST"])
def getShippingMethod():
return jsonify(name=session["shipping"]["name"])
Ruta pentru plasare a unei comenzi, va verifica validitatea datelor de livrare completate n
formular de ctre utilizator, iar dac acestea sunt valide va trimite un email cu factura
administratorului i unul clientului. n caz contrar il va avertiza pe utilizator de invaliditatea
datelor introduse de el.
@app.route('/place_order', methods=["POST"])
def placeOrder():
form = AddressForm(request.form)
if form.errors:
return jsonify(status='fail', errors=form.errors)
62
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
name=g.user.name,
total=g.cart.getTotal(),
phone=form.phone.data,
region=form.region.data,
city=form.city.data,
address=form.address.data,
shipping=request.form['shipping'],
shippingCost=ShippingMethods.query.filter_by(
name=request.form['shipping']).first().price)
)
session["cart"] = {}
return jsonify(status="ok")
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String, nullable=False)
name = db.Column(db.String, nullable=False)
password = db.Column(db.String, nullable=False)
email = db.Column(db.String, nullable=False)
userData = db.relationship('UserData', backref='user', lazy='dynamic')
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anoymous(self):
return False
def get_id(self):
return unicode(self.id)
def __init__(self, username, name, password, email):
self.username = username
self.name = name
self.password = password
# An user should have a primary email address.
self.email = email
def __repr__(self):
return "<User(%r, %r, %r)>" % (self.username, self.name, self.password)
65
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
Meodele is_authenticated, is_active, is_anonymous si get_id sunt folosite cu scopul de face
clasa User compatibil cu extensia flask-mail.
Clasa UserData, este folosit pentru a stoca date despre locaia n care se va expedia produsul
unui utilizator. Motivul pentru care nu-l constrngem pe utilizator sa-i selecteze adresa de
transmitere a coletului de la nceput este pentru ca aceasta poate efectua o comanda de pe o
adresa diferita. Intre clasa User i clasa UserData este o relaie de tip one-to-many, ntrucat un
utilizator poate avea mai multe adrese.
class UserData(db.Model):
__tablename__ = 'userdata_table'
id = db.Column(db.Integer, primary_key=True)
phone = db.Column(db.String)
email = db.Column(db.String)
region = db.Column(db.String)
city = db.Column(db.String)
address = db.Column(db.String)
userId = db.Column(db.Integer, db.ForeignKey('user_table.id'))
def __init__(self, phone=None, email=None, region=None, city=None,
address=None):
self.phone = phone
self.email = email
self.region = region
self.city = city
self.address = address
def __repr__(self):
return "<UserData(%r, %r, %r, %r, %r)>" % (self.phone, self.email,
self.region, self.city, self.address)
66
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
__tablename__ = 'product_table'
id = db.Column(db.Integer, primary_key=True)
category = db.Column(db.String, nullable=False)
description = db.Column(db.String, nullable=False)
name = db.Column(db.String, nullable=False)
price = db.Column(db.Float, nullable=False)
stock = db.Column(db.Integer, nullable=False)
comments = db.relationship('ProductComment', backref='product',
lazy='dynamic'
)
pictures = db.relationship('ProductPictures', backref='product',
lazy='dynamic'
)
specifications = db.relationship('ProductSpecifications',
backref='product',
lazy='dynamic'
)
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
class ProductPictures(db.Model):
__tablename__ = "product_pictures_table"
id = db.Column(db.Integer, primary_key=True)
link = db.Column(db.String, nullable=False)
date = db.Column(db.DateTime, nullable=False)
productId = db.Column(db.Integer, db.ForeignKey('product_table.id'))
def __init__(self, link, productId):
self.link = link
self.productId = productId
self.date = datetime.utcnow()
def __repr__(self):
return "<ProductPicures(%r)>" % self.link
Clasa ProductComment, este folosita pentru a reprezenta n baza de date un comentariu postat
de un utilizator la adresa unui produs. Ca i in cazul anterior, se creaza o relatia one-to-many
ntre clasele Product si ProductComment, ntruct un produs poate avea mai multe comentarii.
class ProductComment(db.Model):
__tablename__ = 'product_comments_table'
id = db.Column(db.Integer, primary_key=True)
comment = db.Column(db.String, nullable=False)
userId = db.Column(db.Integer, db.ForeignKey('user_table.id'))
productId = db.Column(db.Integer, db.ForeignKey('product_table.id'))
def __init__(self, comment, userId):
self.comment = comment
self.userId = userId
69
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
def __repr__(self):
return "<ProductComment(%r)>" % self.comment
Clasa ProductSpecifications, este folosit pentru a stoca o specificaie a unui produs. ntruct
magazinul suporta diferite tipuri de produse nu se poate uniformiza ntr-un mod eficient modul n
care sunt reprezentate specificaiile unui produs. Din acest motiv am ales s introduc o nou
tebela ce va conine cte o specificaie, creandu-se, astfel, o relatie one-to-many ntre clasa
Product i ProductSpecifications.
class ProductSpecifications(db.Model):
__tablename__ = 'product_specification_table'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
data = db.Column(db.String, nullable=False)
productId = db.Column(db.Integer, db.ForeignKey('product_table.id'))
def __init__(self, productId, name, data):
self.productId = productId
self.name = name
self.data = data
def __repr__(self):
return "ProductSpecfication(%r)" % self.name
Pentru a aduga un nou produs n baza de date va trebui sa instan iem clasa Product i
ProductPictures ntruct multe din funcionalitile aplicaiei nu vor funciona n lipsa unei
poze. Odata creat o nou instan a clasei Product este necesar adugarea ei n baza de date.
Instata clasei ProductPictures poate fi adaugat in baza de date dect dupa ce a fost adaugat
cea a clasei Product ntrucat este necesar id-ul produsului, iar id-ul este generat dect atunci
70
DAVID LAURENIU
ARHITECTURA
MAGAZINULUI WEB
71
IV. CONCLUZII
medie, dar i uneltele moderne folosite pentru ducerea la bun sfarit a unei astfel de aplicaii.
Proiectul prezentat in acest document se difereniaz de celelalte din categoria sa prin folosirea
unei noi tehnologii, relativ noi pe partea de server limbajul Python i biblioteca Flask.
Avantajul acestei diferenieri fa de aplicatiile web clasice ce folosesc, de obicei, un limbaj
precum Php este uurina n dezvoltare.
Dezavantajele acestei opiuni sunt lipsa unor extensii ce ar putea s ajute programatorul n
procesul de devoltare al unui magazin web a fost necesar s implementez aceast
funcionalitate de la zero, dar am compensat printr-un grad mai mare de flexibilitate i faptul c
este mult mai dificil gsirea unei companii de hosting cu un pre rezonabil care s suporte
tehnologiile folosite n acest proiect. Dei numrul companiilor ce ofer hosting pentru aplica ii
ce folosesc Python i Flask este sesizabil mai mic, se compenseaz prin serviciile irepro abile.
Astfel, companii precum Heroku sau Microsoft(cu platforma Windows Azure) ofer servicii
ideale pentru a gzdui aceast aplicaie.
Flask este un framework web nou pe pia, fapt datorit caruia nu beneficiaza de mul imea de
extensii pe care o are la dispoziie Django. Motivul pentru care am optat pentru Flask n
dezvoltarea acestei aplicaii este flexibilitatea. Alegerea unui framework web precum Django near fi impus un mod strict de dezvoltare ce ar fi fcut imposibil implementarea anumitor
funcionaliti.
n momentul de fa, aplicaia pune la dispoziie, cel puin din punct de vedere al utilizatorului
de rand, toate specificaiile necesare pentru a-i conferi utilizatorului o experien de utilizare
decenta. O funcionalitate ce ar fi sporit comunicarea cu utilizatorul ar fi fost implementarea unui
modul de chat, ce ne-ar fi permis s discutm n timp real cu clien ii no tri. Din punct de vedere
al administratorului magazinului, integrarea unui modul de adaugare a produselor ar fi u urat
72
procesul, totui diferena ar fi fost isesizabil. n momentul de fa, produsele se pot adauga prin
intermediul liniei de comand sau prin intermediul unui sistem de management al bazelor de
date.
O funcionalitate pe care dorim s o adaugm pe viitor este un sistem de validare a comenzilor
i a nregistrrii utilizatorilor prin SMS - acest lucru ar duce la sporirea gradului de securitate.
73
V. BIBLIOGRAFIE
74