PROGRAM UL DE STUDIU TEHNOLOGIA INFORMAȚ IEI [623809]
UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICĂ ȘI TEHNOLOGIA INFORMAȚ IEI
PROGRAM UL DE STUDIU TEHNOLOGIA INFORMAȚ IEI
FORMĂ DE ÎNVĂ ȚĂMA NT IF
Proiect de diplomă
Coordonator științific : s. l.dr.ing : George Pecherle
Absolve nt: Tontea Natanael Pavel
Oradea, 2020
3
UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICA SI TEHNOLOGIA INFORMAȚIEI
PROGRAMUL DE STUDIU TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMANT IF
Sistem a utomat pentru
verificarea evoluț iei prețurilor
Coordonator științific : s. l.dr.ing: George Pecherle
Absolvent: [anonimizat], 2020
4
Cuprins
CAPITOLUL I. INTRODUCERE………………………………………………….. ……………………………… … 6
CAPITOLUL II. TEHNOLOGII FOLOSITE… ………………………………………………………………. …. 8
2.1 HTML ……………………………………………………………………….. ……………………….. ………. …………. 8
2.2 CSS………………………………………………………………………… ……………………… ………………….. ….10
2.2.1 BOOTSTRAP ……………………………………………………… …………………………… ………… ………. .11
2.3 PHP………………………………………….. ………………………………………………………….. ……… ………. .12
2.3.1 Laravel………………………………………………………… ……………………………………… ………… ..14
2.3.2 Mink……………….. ………………………………………… ………………………… ……………… ……… ……..16
2.4.2.MySQL………………………………………………………………………………………… ……………………… 17
2.5 Javascript………………………………………………………………… ……………………………….. ……… ……..18
2.6 Expresii regulate – RegexBuddy ………………………………………….. …………………. ………….. …….20
CAPITOLUL III..Prezentarea aplica ției…………………… ……………………….. ………………… ………… ..21
3.1. Descrierea funcționalității ……………………………………………………….. ………………….. ……………21
3.2. Paginile aplicației …………………………………………………………. …………………………. ………. ……..23
3.3. Procesele aplicației ……………………………………….. ……………… ………………………… ………. …….. .30
3.4. Diagrama bazei de date …………………………………………………………. …………………….. …….. ……33
5
3.5. Folosirea frameworkului Laravel în proiect ……………………………………………………….. …….34
CAPITOLUL IV . Concluzii …………………………………………………………. …………………. ………….. 53
CAPITOLUL V . Bibliografie ……………………… …………………………………. ………………… ………….54
6
1.Introducere
În viața cotidiană a fiecăruia din noi preț ul produ selor este un aspect important și de
regulă luăm decizia de a achiziționa sau nu un anumit produs în funcție de prețul acestuia.
Evoluția preț urilor este un factor determinant î n luarea aces tei decizii, deoarece o persoană care
observă o redu cere mare la un produs p e care și -l dorește va avea o tentație mai mare de a
cumpăra acel produs.
Evoluția preț urilor a devenit un aspect important în România după Revoluția din 1989 ș i
trecerea de la economia centralizată la economia de piață, statul asigurând, conform Constitu ției
din 1991, libertatea comerțului și protejarea concurenț ei loiale. Dacă la î nceputul an ilor ’90 a
existat o hiperinflație galopantă în ț ara noastră care a ajuns până la 295% în anul 1993 situaț ia
s-a stabilizat odată cu trecerea anilor prin dezvoltarea economiei, creșterea veniturilor populaț iei
și intrarea pe piață a marilor lanțuri de magazine din Occident (Metro, Selgros, Kaufland,
Carrefour, Auchan, Lidl, Penny) iar anul trecut inflaț ia a fost de 3,8%.
Comerțul în România a intrat într -o nouă epocă prin dezvoltarea magazinelor online și tendința
este în continuă creștere de a achiziționa tot mai mult de pe inter net de la electronice,
electrocasnice, haine, până la mâncare și livrare de produse de bază la domiciliul clientului.
O mare prob lemă care a apărut odată cu diversificarea ofertei a fost cea a ofertelor înșelătoare și
promoț iilor false prin care au fost induși î n eroare cu mpără torii, fiind prejudiciaț i astfel din cauza
acestor practici incorecte.
Această situație a devenit î ngrijoră toare și a provocat dezbateri în societate după apariț ia
pandemiei de c orona virus. Pe fondul panicii ș i a lipsei de stocuri au explodat prețurile la măsti,
dezinfectanți ș i la unele medicamente.
Au fost deasemenea creșteri de preț uri la alimente le de bază precum făina, ulei și legume î n
special în zona rurală .
7
Din această cauză au apărut dezbateri în societate și ONG -urile și asociațiile de consumatori au
cerut intervenția guvernului pentru a se găsi soluț ii.
Au existat propuneri în spaț iul public pentru plafonarea adaosurilor comerciale și chiar
plafonarea prețurilor la produsele medicale ș i ale alimentelor de bază . După analiza rea acestor
propuneri guvernul a comunicat că plafonarea prețurilor nu este o soluț ie deoarece poate apă rea
penurie și vânzare il icită la acele categorii de produse . Soluția găsită a fost importul masiv de
produse care lipseau și stimularea producției pe teritoriul țării ș i creearea unor ca mpanii de
informare la nivel naț ional.
Aplicația pe care am dezvoltat -o ajută utilizatorii î n rezolvarea acestei probleme pentru a
putea observa evoluția prețurilor î n tim p și a evita situațiile în care sunt înșelaț i. Aplicația
permite utilizatorilor să urmarească orice produs de pe emag sau altex. Am ales emag pentru că
este cel m ai mare magaz ine online din România ș i altex deoarece este unul dintre cele mai mari
magazine .
Aplicația se adresează tuturor categorii lor de utilizatori care au cunoștiinț e minime de navigare
pe internet, iar cei ca re au e -mail au posibilitatea să urmărească evoluț ia unui un anumit produs
în timp și să primească informația după perioada de timp selectată .
Aplicația are două părți: partea de că utare a unui produs unde se pot vizu aliza produsele deja
existente în baza de date(de exemplu măști de protecție) și partea de urmă rire a unui pro dus unde
utilizatorul poate urmă ri un produs prin inserarea link -ului acelui produs, introducerea adresei de
e-mail și setarea frecvenț ei, perioada după care clientul va primi mail ul de informare cu produsul
urmă rit.
Aplicaț ia are 5 pagini principa le: Acasă, Produse, Că utare, Urmăreș te un produs ș i Contact.
Această lucrare are 5 părț i: 1. Introducere, 2.Tehnologii utilizate, 3.Prezentarea ap licației,
4.Concluzii, 5. Bibliografie.
8
2.Tehnologii folosite
2.1 HTML
HyperText Markup Language (HTML) este un limbaj de marcare care oferă posibilitatea
de a crea pagini web care vor fi afișate într -un browser . Unul dintre principalele scopuri ale
HTML este prezentarea informațiilor cum ar fi tabelele , paragrafe le sau titlurile și nu descrierea
semanticii documentului. HTML se utilizează de regulă ală turi de tehnologii precum Cascading
Style Sheets(CSS) și limbaje de script, precum JavaScript sau PHP.
Brow serele(navigatoarele) web recepționează documente le HTML de la un server local sau web
și le transformă în pagini web multimedia. HTML poate încorpora programe scrise într -un limbaj
de script cum ar fi JavaScript , care pot avea efecte asupra comportamentul ui și conținutul ui
paginilor web. Includerea CSS definește aspectul și planul conținutului, fiind utilizat alături de
HTML încă din 1997.
Tim Berners -Lee, un colaborator CERN, este fondatorul acestei tehnologii și a dat publicităț ii
pentru pr ima dată , la finalul anului 1991, documentul intitulat “HTML Tags”. Acest document
cuprinde 18 elemente care conțin designul inițial, relativ simplu al HTML. Unsprezece elemente
dintre a cestea sunt încă utilizate î n HTML4.
În noiembrie 1995 a fost lansat HTML2 și erau oferite posibilităț i precum fișiere ba zate
pe formulare, tabele sau hărți cu imagini. Lansat î n 14 ianuarie 1997, HTML3 este prima
versiune standardizată exclusiv de W3C. Prin această versiune au fost eliminate formulele
matematice și au fost îmbun ătățite diversele extensii de proprietate și s -a adoptat cea mai mare
parte a etichetelor de marcare vizuală ale Netscape.
A patra versiune a fost lansată în 18 decembrie 1997 ș i cuprinde t rei variante: Strict, în
această variantă sunt interzise elementele depreciate, Tranzițional, în care sunt permise
elementele depreciate ș i Cadru(Frameset), în care sunt permise în mare parte numai elemente
legate de cadru.
9
În 28 octombrie 2014 W3C a publicat versiunea a cincea a HTML iar î n 2017 5.2 , aceasta fiind
în prezent versiunea utilizată de că tre programatori pentru a crea pagini web.
HTML5 prezintă câteva diferențe față de HTML4:
HTML5 nu mai este un tot unitar ci reprezintă o colecție de aplicații incluzâ nd, pe lângă
tag-uri, și API -uri (Application Progra mming Interface) prin care are loc insearea
elementelor media: video, audio, canvas.
Dacă audio și video nu făceau parte din specificațiile HTML4 ele se regăsesc î n HTML5
fiind create tag -uri speciale pentru înglobarea corectă a elementelor multimedia:
și .
În HTML5 este posibilă geo-localizarea , cu ajutorul JS GeoLocation API se poate detecta
ușor locația unui utilizator care accesează un site.
Grafica vectorială era posibilă în HTML4 doar cu ajutorul unor aplic ații ca Silverlight
sau Flash. HTML5 oferă suport integral pentru grafică vectorială, prin intermediul
elementului [canvas]
Pentru ca motoarele de căutare sa indexeze mai bine paginile web , au fost introduse în
HTML5 ele mentele [header] și [footer] confor m cu noua structură a web -ului.
HTML5 este ada ptat și pentru browser -ele telefoanelor mobile, existâ nd tag-uri care
ajută la optimizarea site -ului pentru varianta mobilă. [4]
Marcarea în HTML este alcatuită din elemente cheie precum etichete( taguri), tipuri de date
bazate pe caractere , referințe de caractere și referințe de entitate. Taguril e HTML sunt utilizate
frecvent în perechi alcă tuite din tagul de deschidere, de exemplu <h1> și tagul de î nchidere de
exemplu </h1>.
10
2.2 CSS
CSS (Cascading Style Sheets) este un standard pentru formatarea elementelor unui
document scris într -un limbaj de marcare precum HTML, XHTML, XML și SVGL.
CSS este una dintre tehnologiile de bază a World Wide Web , al ături de HTML și JavaScript . [6]
CSS es te proiectat pentru a permite separarea prezentării și conținutului, inclusiv aspectul ,
culorile și fonturile . Această separare poate îmbunătăți accesibilitatea conținutului oferind mai
multă flexibilitate și control în specificarea caracteristicilor de prezentare, permite mai multor
pagini web să partajeze formatarea prin specificarea CSS relevantă într -un fișier .css separat și
poate reduce complexitatea și repetarea conținutului structural. .
Separarea formatării și a conținutului face, de asemenea, posibilă prezentarea aceleiași pagini de
marcare în diferite stiluri pentru diferite metode de redare, cu m ar fi pe ecran, prin tipărire sau
prin voce ( cititor de ecran). CSS are, de asemenea, reguli pentru formatarea alternativă dacă este
accesat conținu tul pe un dispozitiv mobil .
CSS are o sintaxă simplă și folosește o serie de cuvinte cheie în limba engleză pentru a
specifica numele diferitelor proprietăți de stil. O foaie de stil este alcătuită dintr -o listă de reguli .
Fiecare regulă sau set de reguli constă dintr -unul sau mai mulți selectori și un bloc de declarații
(declaration block).
CSS3 este un versiunea actuala și conț ine atribute noi care contribuie la dezvoltarea noilor
concepte î n webdesign.
Unele dintre cele mai importante module adăugate î n CSS3 sunt: selectors, box model,
backgrounds si bor ders, efecte de text, transformă ri 2D/ 3D, animații ș i interfaț a utilizator (user
interface).
11
2.2.1 Bootstrap
Bootstrap este un framework CSS creat pentru dezvoltarea web mai rapidă și ușoară ,
fiind gratuit și open source. Bootstrap include șabloane de design HTML ș i CSS pe bază de
formulare, butoan e, tabele, carusele de imagini ș i plugin -uri JavaScript.
Mark Otto și Jacob Thornton de la Twitter sunt cei care au lansat Bootst rap pe Github în august
2011. Î n iunie 2014 Bootstrap a ajuns proiectul nr.1 pe GitHub. Bootstrap 4, lansat pe 18
ianuarie 2018 , este versiunea actuală .
Avantajele Bootstrap :
Ușor de utilizat: orice utilizator care are cunoștințe de bază de HTML s i CSS poate
începe să foloseasca Bootstrap
Caracteristici Responsive: Bootstrap e receptiv CSS ajustâ ndu-se la telefoane, tablete și
desktop – uri
Compatibilitate: Bootstrap este compatibil cu toate browserele (Chrome, Firef ox, Internet
Explorer, Safari, ș i Opera)
Există mai multe tipare responsive:
Mostly fluid: design -ul paginii își menține forma pe majoritatea ecranelor, cu excepția
celor de mici dimensiuni(smartphone), unde cele 3 coloane sunt stivuite una peste
cealaltă , în ordine,
Column Drop : dacă d imensiunea ecranului se micșorează , coloanele încep să fie împinse
în jos, fiind stivuite vertical, una câte una,
Layout Shifter : în acest c az layout -ul paginii se modifică într -un mod semnificativ, în
funcț ie de dimensiunea e cranului, acest lucru reali zându-se cu media -query -uri CSS,
bazat pe dimensiunea viewport -ului,
Content Reflow: acest tipar nu este pentru î ntreaga pa gină, ci pentru aș ezarea u nui singur
element al paginii, î n acest caz se pot utiliza deasemenea media -queryuri CSS . [12]
12
2.3 PHP
PHP (Hypertext Preprocessor) este un limbaj de programare de uz general, cu cod -sursă
deschis (open source), utilizat pe scară lar gă, ș i care este folosit în general pentru dezvoltarea
aplicațiilor web avâ nd posibilitatea de a fi integrat în HTML.
PHP este succesorul PHP/FI care a fost lansat în anul 1995 de către Rasmus Lerdorf fiind, la
început, bazat pe un set de scripturi Per l și pe limbajul C.
Versiunile 2 ș i 3 ale limbajului au fost lansate în 1997 ș i Rasmus Lerdorf a lansat public
codurile -sursa ale PHP astfel oricine putea vizualiza, utiliza și corecta erorile din cod și având
posibilitatea de a îmbună tăți codul -sursă.
În ultima parte a anului 1998 Andi Gutmans și Zeev Suraski au rescris nucleul PHP cu scopul de
a îmbunătăți perfor manța aplicațiilor complexe și modularitatea bazei de coduri -sursă ale
limbajului. Noul nucleu denumit “Zend Engine” s-a aflat la baza PHP 4, ac eastă versiune fiind
lansată în mai 2000 incluzând facilităț i precum susținerea mai multor servere Web și a sesi unilor
HTTP, dar și securizarea mai bună a metodelor de gestionare a datelor introduse de utilizatori.
Lansat în iulie 2004, PHP 5 oferă î mbun ătățiri față de versiunea precedent ă precum: o
orientare obiect mai pronunțată, suport mai bun pentru MySQL ș i MSSQL, iteratori pentru date
și avâ nd posibilitatea de a controla erorile prin tratarea de excepții.
Nu a existat versiunea a ș asea iar PHP 7, care este versiunea actuală , a fost lansat î n 3 Decembrie
2015, ofer ind o versiune nouă a motorul ui ZEND aspect prin care această versiune oferă o
rapiditate de două ori mai mare cu un consum de memorie mai mic. De exemplu pe platform a
Wordpress PHP 5.6 pro cesa 191 cereri/secundă iar PHP 7 procesează 374 cereri/secundă .
PHP este unul dintre cele mai popular e limba je de programare datorită unor caracteristici
precum:
– Familiaritatea: sintaxa limbajul ui este ușoară, fiind o combinaț ie a sintaxelor unora din cele mai
răspâ ndite limbaje (Perl, C);
– Simplitatea: nu este necesară includerea bibliotecilor ori a directive lor de compilare,
13
deoarece codul PHP inclus într -un document se executa între marcajele speciale;
– Eficiența: PHP -ul utilizeaz ă mecanisme de alocare a resurselor, necesare unui mediu
multiutilizator, precum web-ul;
– Flexibilitate: pentru că nu e legat de un anumit server web, PHP a fost integrat pentru
majoritatea servere lor web existente (Apache, IIS, Zeus),
– Securitate: acest limbaj oferă programatorului un set flexibil și eficient de măsuri de siguranță;
– Gratuitate: probabil că este cea mai importantă caracteristică deoarece dezvoltarea PHP -ului
sub licența open -source a determinat adaptarea rapidă a PHP -ului la nevoile web -ului. [7]
Pentru parcurgerea și procesarea textului, funcțiile de prelucrare a array -urilor au un rol
foarte important. Din acestea cele mai uzuale sunt:
– array_count_values(array) – returnează o matrice cu numărul de repetări a fiecarui
element din "array".
<?php
$aray = array('a', 8, 'a', 'b', 'a', 8, 'c');
$re = array_count_values($aray);
print_r($re);
// Return: Array ( [a] => 3 [8] => 2 [b] => 1 [c] => 1 )
?>
• array_intersect (array1, array2, …) – returnează o matrice cu toate valorile din "array1" care se
găsesc în toate celelalte "array" -uri date ca parametrii.
<?php
14
$aray1 = array("a"=>1, "b"=> 'a', "c"=>'d', 'e');
$aray2 = array(8, 'a', 'd');
$aray3 = array(1, 'a', 'c', 'd');
$re = array_intersect($aray1, $aray2, $aray3);
print_r($re);
// Return: Array ( [b] => a [c] => d )
?>
array_ merge($array1, $array2, …) – unește mai multe array în unul singur. Dacă au cheie de tip
șir identice, va fi păstrată valoarea ultimei chei
<?php
$aray1 = array("a"=>1, 3, 4);
$aray2 = array("a"=>2, 8);
$re = array_merge($aray1, $aray2);
print_r($re);
// Return: Array ( [a] => 2 [0] => 3 [1] => 4 [2] => 8 )
?>
2.3.1 Laravel
În realizarea acestei aplicaț ii un rol major l -a avut mediul de lucr u avut la dispoziț ie prin
frameworkul Laravel. Oferind numeroase facilităț i, l-am folosit pentru scrierea ș i organizarea
codului.
Laravel este un framework MVC PHP lansat de Taylor Otwell în 2011. Laravel a devenit
cel mai popular framework PHP gratuit, op en-source din lume pentru că are capabilitatea de a
15
trata aplicații web complexe în mod sigur , într -un ritm considerabil mai rapid decât alte
framework -uri. Laravel simplific ă procesul de dezvoltare prin uș urarea sarcinilor obișnuite, cum
ar fi rutarea, sesiunile, memorarea în cache și autentificarea.
Fig. 2. 1 Diagrama arhitecturii MVC [9 ]
Avantajele framework -ului Laravel:
Laravel este scris în PHP, cel mai popular limbaj de programare a site -urilor dinamice.
Laravel nu are cerințe specifice de sistem și funcționează pe capacitățile majoritatii furnizorilor
de găzduire.
Oferă aproape toată funcționalitatea de bază a site -urilor, inclusiv un sistem p uternic de control
al accesului ș i instrumente pentru trimiterea de e -mail.
Toate instrumentele incluse sunt deja configurate în cel mai bun mod pentru majoritatea
cazurilor.
16
Există multe biblioteci suplimentare scrise de dezvoltatori terți care extind funcționalitatea
framework -ului Laravel.
Laravel include instrumente de prototipare – crearea de semifabricate pentru module
software de diferite tipuri, în care dezvoltatorul sit e-ului va trebui doar să adauge propriul său
cod.
2.3.2 Mink
Mink este un framework de testare, gratuit, a paginilor web, construit pentru aplicațiile
scrise in PHP. Datorită librăriilor și a funcțiilor pe care le are, acest framework permite și
colectarea de date, iar motiv ul special pentru ca re l-am ales este ca execută și javascript, care este
prezent în multe funcționalități ale unui site , și acest lucru se face în mod optim, fapt care îl
diferențează de alte metode de colectare a datelor.
Mink oferă u n API consistent pentru diferite tipu ri de browsere prin drivere. Un driver Mink
este o clasă simplă, care se pune în aplicare prin includerea în cod a interfeței:
Behat \ Mink \ Driver \ DriverInterface. Această interfață descrie metodele de legătură într e
Mink și emulatorul browserului real. Mink comunică cu emulatoare de browser prin
intermediul driver -ului.
Mink v1.2 are cinci drivere definite, iar cele pe care le -am folosit în implementare sunt:
• GoutteDriver – oferă o punte de legătură pentru Goutte headless browser. Goutte este
un php pur clasic, scris de creatorul framework -ului Symfony – Fabien Potencier .
Un driver de tip Goutte se declară astfel:
$driver = new \Behat \Mink \Driver \GoutteDriver();
• Selenium2Driver – oferă o punte de legătură într e Mink și Selenium2 (webdriver) tool.
Selenium2 necesită instalare, apoi trebu ie pornit din terminal prin coma nda:
$ java -jar selenium -server -standalone -2.11.0.jar
17
Un driver de tip Selenium se declară astfel:
$driver = new \Behat \Mink \Driver \Selenium2Driver (
'firefox', 'base_url'
);
Deși putem folosi driverele direct pentru a apela unele acțiuni pe emulator, Mink oferă
o modalitate mai bună – Sesiunea:
// init session:
$session = new \Behat \Mink \Session($driver);
// start session:
$session ->start();
2.4 MySQL
MySQL este “un sistem de gestiune a bazelor de date relațio nale, produs de compania
suedeză MySQL AB și distribuit sub Licența Publică Generală GNU. Este cel mai popular
SGBD open -source la ora actuală, fiind o componentă cheie a stivei LAMP (Linux, Apache,
MySQL, PHP).”[11 ]
Cu toate că de regulă este folosit împreună cu limbajul de programare PHP, cu MySQL
se pot construi aplicații în majoritatea limbajelor de programare. Există multe scheme API
disponibile pentru MySQL prin care se pot scrie aplica ții în diverse limbaje de programare
pentru accesarea bazelor de date MySQL, cum ar fi: C, C++, C#, Java, Perl, PHP, Python ,
fiecare dintre acestea utilizâ nd un tip specific API.
MyODBC este o i nterfață de tip ODBC care oferă permisiunea limbajelor de programare, care
o utilizează , să interacționeze cu bazele de date MySQL cum ar fi ASP sau Visual Basic.
18
În scopul simplificării utiliză rii acestor limbaje de programare, unele companii produc
componente de tip COM/COM+ sau .NET (pentru Windows) prin inte rmediul cărora
respectivele limbaje să poată folosi acest SGBD mult mai ușor decât prin intermediul sistemului
ODBC. Aceste componente pot fi gratuite (MyVBQL) sau comerciale.
Licența GNU GPL nu oferă posibilitatea ca MySQL să fie î ncorporat în softuri co merciale; însă
utilizatorii pot achiziționa, contra cost, o licență comercială de la compania producătoare,
MySQL AB.
MySQL fa ce parte din platformele LAMP ș i WAMP (Linux/Windows -Apache -MySQL –
PHP/Perl/Python). Această aplicaț ie este foarte p opulară deoare ce este utilizată, de regulă,
împreuna cu PHP, unul dintre cele mai c unoscute limbaje de programare și datorită faptului că
MySQL este mai ușor de învățat și folosit decât alte aplicații de gestiune a bazelor de date,
comenzile fiind simple: „exit” sau „qu it”-comanda de ieș ire.
Pentru administrarea bazelor de date MySQL se poate folosi modul linie de comandă sau
se poate descărca o interfață grafică: MySQL Administrator și MySQL Query Browser.
Aplicația gratuită phpMyAdmin poate fi deasem enea utilizată pentru managmentul acestor baze
de date.
MySQL poate fi rulat de majoritatea platformelor software existente: AIX, FreeBSD,
GNU/Linux, Mac OS X, NetBSD, Solaris, SunOS, Windows 9x/NT/2000/XP/Vista.
2.5 Javascript
JavaScript a fost dezvoltat inițial de către firma Netscape , cu numele de Live Script , un
limbaj de script care extindea capacitățile HTML, oferă o alternativă parțială la utilizarea unui
număr mare de scripturi CGI pentru prelucrarea informațiilor din formulare și care adaugă
dinamism în p aginile web.
19
Caracteristici Javascript (versiunea actuală 1.7):
JavaScri pt poate fi introdus în HTML – de obicei codul JavaScript este gă zduit în
documentele HTML și executat în interiorul lor. Majoritatea obiectelor JavaScript au etichete
HTML pe care le reprezintă, astfel încât programul este inclus pe partea de client a limbajului.
JavaScript foloseș te HTML pentru a intra în cadrul de lu cru al aplicațiilor pentru web. Pentru
inserarea codului JavaScript într-un document HTML se foloseș te tagul <script> .
JavaScript este dependent de mediu – JavaScript este un limbaj de scr iptare; software -ul
care rulează în fapt programul este browser -ul web (Firefox, Opera, Netscape Navigator, Internet
Explorer, Safari, etc.) Este important a se lua în considerare această dependență de browser
atunci când utilizăm aplicații JavaScript.
JavaScript este un limbaj în totalitate interpretat – codul scriptulu i va fi interpretat de browser
înainte de a fi executat. JavaScript nu necesită compilări sau preprocesări, ci rămane parte
integrantă a documentului HTML. Dezavantajul acestui limbaj este că rularea durează mai mult
deoarece comenzile JavaScript vor fi ci tite de navigatorul Web și procesate atunci când user -ul
apelează la acele funcții (prin completare de formulare, apăsare de butoane, etc). Avantajul
principal este că oferă posibilitatea de a actualiza mai ușor codul sursă.
JavaScript este un limbaj flexi bil – în aceasta privință limbajul diferă de C++ sau Java. În
JavaScript se poate declara o variabilă de un anumit tip, sau se poate lucra cu o variabilă chiar
dacă nu se cunoaș te tipul specificat înainte de rulare.
JavaScript este bazat pe obiecte – JavaScript nu este un limbaj de programare orientat obiect ci
este "bazat pe obiecte"; modelul de obiect JavaScript este bazat pe instanță și nu pe moștenire.
JavaScript este condus de evenimente – mare parte a codului JavaScript răspunde la evenimente
genera te de utilizator sau de sistem. Obiectele HTML, cum ar fi butoanele, sunt îmbunătățite
pentru a accepta handlere de evenimente.
JavaScript este multifuncțional – limbajul poate fi utilizat î n diverse cazuri pentru a rezolva
diferite probleme: grafice, mat ematice, și altele.
20
JavaScript acoperă contexte diverse – programarea cu acest limbaj este îndreptată mai
ales către partea de client, dar se poate utiliza JavaScript și pentru partea de Server. JavaScript
este limbajul nativ pentru unele instrumente de de zvoltare web, ca Borland IntraBuilder sau
Macromedia Dreamweaver. [8]
2.6 Expresii regulate – RegexBuddy
Expresiile regulate (sau regex) sunt un șir de caractere șablon care descriu mulțimea
cuvintelor posibile care pot fi formate cu acele caractere, respectând anumite reguli. Aceste
expresii regulate folosesc paranteze (rotunde, pătrate, acolade) prin care formează regulile de
formare a cuvintelor. Utilitatea cea mai frecventă a unei expresii regulate constă în a
recunoaște dacă un șir conține sau nu sub -șiruri care pot fi formate prin expresia regulată
respectivă.
Cu ajutorul expresiilor regulate se pot găsi sau înlocui anumite părți dintr -un text. Sunt
o metodă utilizata pentru a verifica de exemplu v aliditatea adreselor de e -mail, domenii de
internet sau coduri poștale . Un e -mail valid trebuie să se respecte un model prestabilit.
De asemenea cu ajutorul expresiilor regulate putem să analizăm fișiere mari de text în
căutarea informațiilor dorite.
21
3.Prezentarea aplicaț iei
3.1. Descrierea funcționalităț ii
Aplicația se adresează tuturor categoriilor de utilizatori care doresc să afle evoluț ia
prețului unui p rodus de pe site -urile emag.ro ș i altex.ro.
Aplicația are 2 părț i:
– de că utare – userul are posibili tatea de a căuta în site după un produs anume. Dacă produsul
există în baza de date atunci aplicația va returna o listă cu rezultatele dup ă acea că utare.
fig. 3.1 Interfata functiei de cautare a unui produs in site
– de urmărire a unui produs – dacă produsul căutat nu există în baza noastră de dat e se poate face
o cerere de urmă rire a unui produs prin completarea unui formular:
22
fig.3.2 Interfata formularului de cerere de urmarire a unui produs in site
După apăsarea b utonului “urmăreș te” utilizatorul va primi un mesaj prin care va fi informat ca
cererea lui a fost înregistrată și va primi un email peste câ teva zile.
fig. 3.3 Mesajul primit de utilizator in urma trimiterii cererii de solicitare
23
3.2. Paginile aplicaț iei
Site-ul are 5 pagini principale:
Acasă
Produse
Căutare
Urmărește un produs
Contact
3.2.1 Pagina Acasă
Este pagina pe care este redirectat un vizitator când intră iniț ial pe site. Cuprinde un
mesaj de bun venit și cele mai importante functionalități ale aplicației: formularul de căutare al
unui produs ș i formularul de solicitare a urmă ririi preț ului unui produs.
24
fig. 3.4 Interfața paginii Acasă
2.2 Pagina Produse
Cuprinde o l istă cu toate produsele existente în baza de date. Datorită numă rului mare de produse
s-a folosit p aginare cu 10 elemente pe pagină, iar aceasta face mai rapidă î ncarcarea paginii.
25
fig. 3.5 Interfa ța paginii Produse
3.2.3 Pagina Că utare
Este pagina prin care utiliz atorul are posibilitatea de a căuta după numele unui produs. Dacă
produsul se găsește în baza de date se va afișa o listă cu rezultatele că utarii, evident cu paginare.
Exemplu: dacă utilizatorul introduce în formular cuvântul: “mască” ș i va a păsa pe buton ul
“Caută ” sau pe tasta “Enter”, îi va apărea o listă cu rezultatele că utării:
26
fig. 3.6 Completarea formularului de că utare
fig. 3.7 Lista de rezultate în urma căutării după termenul “masca”
27
3.2.4 Pagina Urmărește un produs
Dacă utilizatorul nu gaseș te produsul dorit pe site, ar e posibilitatea de a c ompleta un
formular prin care să solicite urmărirea preț urilor pentru acel produs.
Userul are de introdus:
un link de pe EMAG sau ALTEX,
emailul – pe care va primi graficul cu preț uri
frecve nța – cât de des să se crawleze preț ul produsului dorit:
o zi
7 zile
30 zile
Frecvența setată reprezintă și peste câ te zile va primi userul emailul.
3.2.5 Pagina unui produs
Pe pagina unui produs s e poate ajunge de pe orice listă cu produse.
Cuprinde date despre produs și graficul cu preț urile.
fig. 3.8 Exemplu de grafic cu prețurile unui produs cu diferențe majore de preț
28
fig. 3.9 Exemplu de grafic cu prețurile unui produs fără diferențe majore de preț
fig. 3.10 Exemplu de grafic cu preț urile unui produs cu s căderea prețului î n timp
3.2.6 Pagina Contact
Este o pagină prin care utilizatorul poate compl eta un formular cu o sesizare, î ntrebare
sau propunere pentru adminii site -ului.
29
fig. 3.11 Pagina Contact
3.3. Procesele aplicaț iei
Proiecarea aplicației am gândit -o să cuprindă 2 mari procese:
1. Culegerea zilnică de informații despre preț ul unui produs
2. Procesul soluționării unei cereri de urmă rire a pr ețurilor unui produs
3.3.1 Procesul de culegere a datelor
Pentru a î ndeplini dorinț ele utilizatorilor cu privire la urmărirea preț urilor unui produs,
30
s-a constatat a fi folosito are culegerea zilnică a preț urilor pentru toate prod usele. Acest lucru se
realizează prin rularea unor funcț ii care culeg date despre produse și le inserează în baza de date.
În cele ce urmează este prezentată diagrama de culegere a datelor:
fig. 3.12 Diagram a procesului de culegere zilnică a datelor
31
În urmă torul subcapitol sunt prezenta te și funcțiile ș i tehnicile de culegere a datelor.
3.3.2 Procesul soluționării unei cereri de urmărire a preț urilor unui produs
Când un utilizator completează formularul de solicitare a urmăririi preț urilor unui produs
și apasă pe butonul “Trimite”, î n backend se instanțiază o “cerere” care va trece prin mai multe
etape până la soluț ionarea sa.
Precum se poate vedea și în diagrama de mai jos, după ce utilizatorul introd uce un link de
produs acesta se va căuta în BD. Dacă este găsit î n BD atunci se va afișa o listă cu rezultatele
căutarii dacă sunt mai multe. Dacă produsul nu este găsit atunci se va salva în BD î ntr-o “listă”
care va rula crawlerul zilnic. În prima fază , se va insera doar linkul produsului, de pe emag sau
altex; ema il-ul utilizatorului; și id_product. Apoi, o altă funcție va na viga pe link și se va face un
update cu alte informaț ii despre produs: nume, cat egorie. Acest pas poate fi denumit, conceptual,
și crearea listei de produse pentru care ruleaza crawlerul zilnic.
32
fig. 3.13 D iagrama procesului de soluționare a cererilor de urmărire a preț urilor unui produs
3.4. Diagrama bazei de date
Din proiectarea aplicației au rezultat trei tabele principale:
products – lista cu toate produsele
crawlers – aici se salvează zilnic preț urile produselor
follow_requests – este tabela unde se inserează toate cererile de urmărire a
prețurilor unui produs
După cum se poate vedea în diagramă, avem două relații î ntre tabele:
o relație de 1:m î ntre tabelele products și follow_requests ; o cerere de urmă rire poate să
conțină doar un singur p rodus, iar un produs poate aparț ine mai multor cereri.
o relație de 1:m î ntre tabelele products și crawlers ; un crawler poate fi asignat doar unui
singu r produs, iar un produs poate să aibă mai multe crawlere.
33
fig. 3.14 Diagrama bazei de date
Proiectul mai conține ș i alte tabele secundare pentru partea de admin, mai exact pentru
autentificare, tabele generate au tomat de framework -ul Laravel, în care se păstrează datele de
autentificare a unui user.
3.5. Folosirea framewor kului Laravel în proiect
În realizarea acestei aplicaț ii un rol major l -a avut mediul de lucru avut la dispoziție prin
frameworkul Laravel. Având numeroase facilităț i, a simplificat mult munca depusă pentru
scrierea ș i organizarea codului.
Ca orice framework bazat pe MVC, Laravel are modele, controlere ș i views. Proiectul a
fost creat cu numele “ price ” prin comanda:
composer global require laravel/installer laravel new price
34
3.5.1 Configurarea de mediu
fig. 3.15 Screen cu fiș ierul .env din proiect
Configurarea se face în fișierul .env în care setăm numele aplicaț iei, numele bazei de date,
user name -ul bazei de date, parola și alte setă ri care sunt necesare pentru realizarea proiectului.
3.5.1. MVC în aplicaț ie
Din proiectarea aplicaț iei au rezultat 5 controllere în care am grupat logica și
funcționalitățile aplicației. Fiecare funcție din controller returnează î nspre un view.
35
fig. 3.16 Modelele proiectului fig. 3.17 Controlerele proiectului
36
fig. 3.18 Organizarea fișierelor î n views
3.5.2 Rutele
În Laravel rutele le găsim în fiș ierul routes/web.php.
37
fig. 3. 19 Poziționarea fișierului web.php î n proiect
Definirea rutelor unei aplicații este primul și cel mai important lucru de abordat î ntr-un
proiect, deoarece prin acestea avem posibilitatea de a interacțion a cu utilizatorul final. Aplicația
are rutele împărț ite pe 2 nivele de acces:
un nivel de acces p entru utilizatorul obiș nuit, nelogat
un nivel de acces pentru admin
Rutele pentru utilizatorii sunt:
fig. 3.20 Rutele pentru utilizatori
38
Rutele pent ru admin sunt grupate prin funcț ia gr oup(), iar accesul este restricț ionat prin
middleware -urile “auth” ș i “admin”.
fig. 3.21 Rutele valabile doar pentru admin
3.5.3 Rest ricționarea accesului
Pe langă middl eware -urile create automat de că tre Laravel, proiectul mai are construit un
middleware pentru a verifica dacă un user care vrea să se logheze este admin sau nu. Comanda
prin care se creează un middleware este:
php artisan make:mi ddleware Admin
Aceasta va crea un nou fișier numit Admin.php în directorul app/Http/Middleware/ cu o
clasă Admin și o me todă handle() la care am mai adăugat o condiție prin care se verifica dacă
userul curent este admin. Funcția isAdmin() este implementată în modelul User.php și returnează
câmpul is_admin din baz a de date din tabela users. Dacă userul este admin atunci este redirectat
către ruta cerută, altfel este redirectat î nspre pagina Acasă .
39
fig.3. 22 Verificarea userului curent dacă e admin
Apoi numele middl eware -ului “admin” se declară și în Kernel.php, după care se folosește în
restricț ionare a rutelor pentru acces, lucru făcut în fiș ierul routes/web.php.
40
fig. 3. 23 Adăugarea middleware -ului „admin‟
3.5.4 Afișarea liste i cu toate produsele existente î n baza de date
Această listă este folosită în site pe pagina Produse și se accesează prin ruta:
fig.3. 24 Ruta pentru lista de produse
41
În controller -ul ProductController, î n metoda index() se iau toate produ sele din baza de
date prin funcț ia select(). Deoarece sunt foarte multe produse s-a folosit paginare, prin funcția
paginate(10), afisându -se câ te 10 produse pe o pagina.
fig. 3. 25 Funcț ia din spatele listei de produse
După cum se poate vedea în figura 3.26, metoda index() returnează un view care se găsește î n
products/index.blade.php.
fig. 3.26 View -ul listei de produse
3.5.5 Căutarea după un anumit produs
Căutarea unui produs este o funcț ionalitate a aplicației foarte importantă , deoarece prin
aceasta utilizatorul este ajutat să găsească mai repede un produs dorit pe site. Astfel, inputul de
42
cautare este inclus în mai multe locuri în aplicație: pe pagina Acasă, pe pagina de Că utare, pe
pagina cu rezultatele că utarii dupa un termen.
Ruta pentru că utare este “/search”:
fig. 3. 27 Ruta pentru că utare
care duce la metoda search() din ProductController:
fig. 3. 28 Funcția care realizează că utarea
După ce se face căutarea î n BD, se trimite la view -ul “products.search” atât un array cu
rezultatele căutarii cât ș i variabila $query.
Având în vedere că se fol oseste codul în mai multe locuri, î n ideea de a respecta bu nele
practici din Laravel, am făcut un fișier pentru formularul de că utare, pe care apoi l -am inclus în
pagina de Căutare și pagina Acasă , prin: @include('..components.se archform').
43
fig. 3.29 Formul arul de căutare după un produs
fig. 3.30 View -ul unde e inclus formularul de căutare după un produs
3.5.6 Formularul cererii de urmă rire al unui produs
Se accesează prin ruta “requests”, o rută de tip resources:
44
fig. 3. 31 Ruta cererii de urmă rire a unui produs
care duce î nspre controlerul FollowRequestCo ntroller, la metodele create() ș i stor e(). Metoda
create() doar returnează un vi ew cu formularul cererii de urmărire a preț urilor unui produs.
fig. 3. 32 Funcția care returnează formularul de căutare după un produs
Având în vedere că acest formular apare î n 2 locuri, codul a ferent formularului a fost pus într -un
fișier, apoi inclus în paginile: Acasă și Urmă rire produs.
fig. 3. 33 View -ul paginii de Urmă rire a unui produs
Includerea formul arului cererii de urmărire a unui produs î n pagina create.blade.php
45
Odată ce se face submit la acest formular, se va executa metoda store() din controllerul
FollowRequestController:
public function store (Request $request )
{
$this ->validate ($request , [
'link' => 'required' ,
'email' => 'required'
]);
//un obiect care va insera in tabela followRequests
$req = new FollowRequest ([
'link' => $request ->get('link'),
'email' => $request ->get('email' ),
'frecv' => $request ->get('frecv' )
]);
//id produs
if (strstr ($req->link, "pd/" )) {
$e = explode ('pd/', $req->link)[1];
$req->id_product = str_replace ('/', '', $e);
} elseif (strstr ($req->link, "X-Product -Id=")) {
$e = explode ('X-Product -Id=', $req->link)[0];
$req->id_product = explode ('&', $e)[0];
} elseif (strstr ($req->link, "fd/" )) {
$e = explode ('fd/', $req->link)[1];
$req->id_product = str_replace ('/', '', $e);
} else {
print_r ($req->link);
die('nu s-a luat corect id_product' );
}
//daca exista produsul, userul este redirectat la o pagina de search dupa acel produs
46
if (Pr::where ('page_link' , $request ->get('link' ))->exists ()) {
$products = Pr::where ('page_link' , '=', $request ->get('link' ))
->paginate (10)
->setPath ('');
$query = $request ->get('link' );
return view ('..products.search' , compact ('products' , 'query' ))->with('success1' , 'Linkul
atasat de catre dumneavoastra deja exista in evidenta noastra.' );;
}
$req->frecv = str_replace ('day', '1', $req->frecv );
$req->frecv = str_replace ('week' , '7', $req->frecv );
$req->frecv = str_replace ('month' , '30', $req->frecv );
$req->save();
//un obiect care va insera in tabela prs
$req1 = new Pr([
'page_link' => $request ->get('link' ),
'id_product' => $req->id_product
]);
$req1 ->save();
return redirect ()->route ('requests.create' )->with('success' , 'Cererea dumneavoastra a fost
inregistrata! In curand veti primi un email cu graficul preturilor produsului atasat.' );
}
fig. 3. 34 Funcția prin care se gestionează și salvează o cerere de urmă rire a unui produs
47
3.5.7 Pagina unui produs
Pe pagina unui produs se ajunge de pe una din listele de produse, prin ruta de forma
“products/{id_product}”:
fig. 3. 35 Ruta paginii unui produs
După cum am aratat și î n capitolele anterioare, pagina produsului cuprinde un grafic.
Pentru aceasta am instalat un modul de grafice prin comanda:
composer require consoletvs/chart s "7.*" , apoi am creeat o clasă numit ă Price de tipul
chart, prin comanda:
php artisan make:chart Price
În grafic s -au luat prețurile unui produs, primit ca și parametru la funcț ia store (), pe zilele
aferente, precum î n imaginea de mai jos:
fig.3. 36 Forma în care arată array -ul pregă tit pentru grafic
48
fig. 3. 37 Funcț ia din spatele paginii unui produs
View -ul pentru pagina produsului :
fig. 3. 38 View -ul paginii unui produs
49
fig.3. 39 View -ul paginii unui produs
3.5.8 Pagina de admin
După cum am menționat și î n capitolele anterioare , aplicația are două mari procese, cel de
culegere zilnică a datelor ș i cel de soluț ionare a cererilor venite din partea utilizatorilor – de
urmărire a preț urilor.
Acest lucru a generat nevoia un ui panou de administrare a funcțiilor care fac procesele să
funcț ioneze. Accesul la pagina de admin se fa ce cu logare, link -ul de login ș tiindu -l doar
persoana acreditată ca și admin, iar pe pagina principală a site -ului, la care au acces utilizatorii,
nu apare nici un buton de logare.
Pagina de admin conț ine bu toanele care pornesc urmă toarele procese:
1. procesul de crawlare zilnică – este reprezentat de funcț ia crawler() din controllerul
CrawlersController prin ruta:
fig.3. 40 Ruta î nspre crawler
50
Se parcurg toate produsele din tabela products și se navighează pe pagina de rulare a crawleru -lui
produsului cu ajutorul funcț iilor din utilitarul Mink. Cu ajutorul xphat -urilor si a funcțiilor din
Mink se extrage preț ul, apoi cu ajutor ul expresiilor regulate se “curăța” informația, inserându -se
în baza de date prețul ș i data curent ă în tabela crawlers.
public function crawler ()
{
$products = Pr::all();
$client = new \Behat \Mink \Driver \Goutte \Client ();
$driver = new \Behat \Mink \Driver \GoutteDriver ($client );
$session = new \Behat \Mink \Session ($driver );
$session ->start();
foreach ($products as $product ) {
$session ->visit($product ->page_link );
$page = $session ->getPage ();
//pret
if ($t = $page ->find('xpath' , "//p[@class='product -new-price']" )) {//emag
$price = preg_replace ("~\s*([\d\.]+?)( \d\d)\s.*~is" , '$1,$2' , $t->getText ());
$price = (float) trim(str_replace ('lei', '', $price ));
} elseif ($t = $page ->find('xpath' , "//div[@class='Price -current']" )) {//altex
//print_r( $t ->getText());die;
$price = preg_replace ("~\s*([\d\.]+?)( \d\d)\s~is" , '$1,$2' , $t->getText ());
$price = (float) trim(str_replace ('lei', '', $price ));
}
//pretul vechi
if ($t = $page ->find('xpath' , "//p[@class='product -old-price']" )) {//emag
$old_price = preg_replace ("~\s*([\d\.]+?)( \d\d)\s.*~is" , '$1,$2' , $t->getText ());
$old_price = (float) trim(str_replace ('lei', '', $old_price ));
} elseif ($t = $page ->find('xpath' , "//div[@class='Price -old']" )) {//altex
$old_price = $t->getText ();
51
$old_price = preg_replace ("~\s*([\d\.]+?)( \d\d)\s~is" , '$1,$2' , $old_price );
}
$req = new Crawler ([
'date' => date('Y-m-d H:i:s' ),
'id_product' => $product ->id_product ,
'old_price' => $old_price ,
'price' => $price
]);
$req->save();
}
$session ->stop();
return redirect ()->route ('admin' )->with('success' , 'Crawlerul a rulat cu succes!' );
}
fig. 3.41 Funcț ia crawler()
2. procesul de soluționare a cererilor de urmărire a preț urilor unui produs – se realizează prin
funcț ia updat eFollowRequests()care selectează toate cere rile care au status = 0; pentru
acestea se verifică dacă data înregistrării solicitării este egală cu data curentă minus
frecvenț a; daca sunt egale, atunci v ariabila status se pune pe “1” ș i se trimite email la
utilizatorul care a fă cut solicitarea cu un link care duce spre graficul produsului în cauză .
52
fig. 3.42 Interfaț a Admin
53
4. Concluzii
Aplicația pre zentată în această lucrare oferă o soluție simplă și eficientă, care poate fi
utilizată de către o rice person ă pentru a vedea evoluția prețurilor în timp a unui produs și a nu fi
înșelat prin oferte false.
Astfel această aplicație reprezintă o soluție la problema fluctuației prețurilor, deoarece aș a cum
s-au exprimat atât Guvernul cât ș i majo ritatea specialiștilor în economie plafonarea preț urilo r
sau a adaosului com mercial nu e o soluție, situaț ia putând fi rezolvată prin corecta informare a
cetăț eanului.
Site-ul poate fi utilizat de către orice persoană care are cunoștiinț e minime de navigare pe
internet, iar pentru partea de urmă rire a unui pr odus utilizatorul trebuie sa dețină o adresă validă
de e-mail. O facilitate de bază a acestei aplicații o reprezintă notificarea utilizatorilor pe e -mail,
cu graficul preț urilor unui produs, conform f recvenț ei setate de fiecare.
Așa cum am prezentat pe parc ursul acestei lucrări, aplicația are cinci părți si există două
nivele de acces: pentru utilizatori și pentru admin.
Pe viitor aplicația poate fi dezvoltată prin p arteneriate cu site -urile emag și altex(pe care a
fost făcut studiul până acum) dar și cu celelalte magazine online ș i astfe l să fie incluse noi
facilităț i cum ar fi:utilizatorul să poata vedea istoricul pentru majoritatea produselor aflate în
vânzare, iar la partea de urmărire produs să poată primi notificările ș i pe Facebook, W hasApp și
alte rețele de socializare, nu doar pe e -mail.
54
5. Bibliografie
1.https://www.link -academy.com/cursul -programming -html5 -with-javascript -and-css3# ,
consultat la 9.03.2020,
2. http://www.catalog -cursuri.ro/Articol -Ce_aduce_nou_HTMl5 -Resursa -591.html, consultat la
9.03.2020,
3. https://marplo.net/css/introducere , consultat la 9.03.2020,
4. https://en.wikipedia.org/wiki/HTML , consultat la 9.03.2020,
5. https://www.htmlgoodies.com/beyond/article.php/3893911/Web -based -Mobile -Apps -of-the-
Future -Using -HTML -5-CSS-and-JavaScript.htm , consultat la 14.03.2020,
6. https://en.wikipedia.org/wiki/Cascading_Style_Sheets , consultat la 14.03.2020,
7. https://web.ceiti.md/lesson.php?id=7 , consultat la 27.03.2020,
8. https://web.ceiti.md/lesson.php?id=16 , consultat la 27.03.2020,
9. https://web.ceiti.md/lesson.php?id=17, consultat la 28.03.2020,
10. https://medium.com/tutoriel/despre -regex -expresii -regulate -2568eabe33ef, consultat la
10.05 .2020,
11. https://ro.wikipedia.org/wiki/MySQL, consultat la 10.04.2020 ,
12. http://www.w3bai.com/ro/bootstrap/bootstrap_get_started.html , consultat la 12.04.2020 ,
13. https://www.youtube.com/watch?v=EHwd0jEuVJY , consultat la 18.03.2020 ,
14.https://charts.erik.cat/guide/create_charts.html , consultat la 18.03.2020 ,
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: PROGRAM UL DE STUDIU TEHNOLOGIA INFORMAȚ IEI [623809] (ID: 623809)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
