PROGRAMUL DE STUDIU TEHNOLOGIA INFORMAȚIEI [613570]
1
UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICĂ ȘI TEHNOLOGIA
INFORMAȚIEI
PROGRAMUL DE STUDIU TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMÂNT IF
PROIECT DE DIPLOMĂ
COORDONATOR ȘTIINȚIFIC
Conf. Dr.Ing. GIANINA GABOR
ABSOLVENT: [anonimizat]
2018
2
FACULTATEA DE INGINERIE ELECTRICĂ ȘI TEHNOLOGIA INFORMAȚIEI
DEPARTAMENTUL CALCULATOARE ȘI TEHNOLOGIA INFORMAȚIEI
TEMA _____
Lucrare de finalizare a studiilor a student: [anonimizat]: TRIPON TEODOR -DORIN
1). Tema lucrării de finalizare a studiilor: APLICAȚIE WEB PENTRU MANAGEMENTUL
MAGAZINELOR
2). Termenul pentru predarea lucrării: 3 iulie 2018
3). Elemente inițiale pentru elaborarea lucrării de finalizare a studiilor: HTML și
CSS, Sass, JavaScript, TypeScript, Node.js , framework -ul Angular, MongoDB.
4). Conținutul lucrării de finalizare a studiilor: Introducere; Limbaje și tehnologii
utilizate pentru implementarea aplicației –. JavaScript, TypeScript, Node.js, Angular, MongoDB,
HTML 5, CSS și SASS ; Tipuri de software utilizate – Visual Studio Code, Git, Visual Studio
Team Services, Postman, Docker; Proiectarea și implement area aplicației –Proiectarea aplicatiei,
Structura aplicatiei, Structura unui service API, Structura aplicatiei angular, Structura bazei de
date, Implementarea aplicatiei; Concluzii; Bibliografie.
5). Material grafic:
6). Locul de documentare pentru ela borarea lucrării: Internet, labotrator Calculatoare,
biblioteca universității
7). Data emiterii temei 1 octombrie 201 8
Coordonator științific
Conf. dr. ing. Gianina GABOR
1
UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICĂ ȘI
TEHNOLOGIA INFORMAȚIEI
PROGRAMUL DE STUDIU TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMÂNT IF
APLICAȚIE WEB PENTRU
MANAGEMENTUL
MAGAZINELOR
COORDONATOR ȘTIINȚIFIC
Conf. Dr.Ing. GIANINA GABOR
ABSOLVENT: [anonimizat]
2018
2
CUPRINS
INTRODUCERE 3
CAPITOLUL I. LIMBAJE ȘI TEHNOLOGII UTILIZATE 4
I.1. JAVA SCRIPT 4
I.2 TYPESCRIPT 5
I.3 NODE.JS 6
I.4 ANGULAR 8
I.5 MongoDB 11
I.6 HTML 5 12
I.7 CSS și SASS 13
CAPITOLUL II. TIPURI DE SOFTWARE UTILIZATE 15
II.1 VISUAl STUDIO CODE 15
II.2 GIT 16
II.3 VISUAL STUDIO TEAM SERVICES 17
II.4 POSTMAN 18
II.5 DOCKER 19
CAPITOLUL III. PROIECTAREA ȘI IMPLEMENTAREA APLICAȚIEI 21
III.1 PROIECTAREA APLICAȚIEI 21
III.2. STRUCTURA APLICAȚIEI 22
III.2.1 STRUCTURA UNUI SERVICE API 23
III.2.2 STRUCTURA APLICAȚIEI ANGULAR 26
III.3. STRUCTURA BAZEI DE DATE 28
III.4. IMPLEMENTAREA APLICAȚIEI 33
CONCLUZII 45
BILBIOGRAFIE 46
3
INTRODUCERE
Managementul unui magazin este o acțiune complexă și costisitoare din punct de
vedere financiar și ca timp, dar acesta este unul dintre factorii principali care duc la obținerea
profitului și în consecință succesul unui magazin sau la pierderi financiare ș i faliment.
Considerând acestea o soluție software de management este tot mai mult o necesitate
și nu doar o optimizare pentru comercianți. Suntem obiș nuiți să vedem astfel de sisteme cu
case de market modern cu scanner laser pe care le întâlnim în supermarketuri și lanțurile de
magazine consacrate, dar ma joritatea magazinelor din mici ș i mijlocii d in țara (precum cele de
cartier , din mediul rur al sau cu un spe cific anume) nu folosesc astfel de sisteme , se bazează pe
casa de marcat fiscal care emite bonuri, pe clasicele registre scrise de mană pentru a ține
evidența vânzărilor, a stocului de produse și pe etichetele de pe rafturi și memoria
comerciantului pentru evidența prețurilor și a trendurilor în rândul cumpărătorilor.
Există multiple motive pentru lipsa unui astfel de sistem de management informatic
din aceste magazineși consider principalul motiv ca fiind efortul financiar considerabil
necesar achiziționă rii și menținerii hardware -ului și software -ului pentru un sistem conform
celor din supermarket, pe care proprietarii/managerii unor astfel de magazine le consideră
prea costi sitoare pentru cifra de afaceri a magazinului.Un al doilea motiv ar fi evitarea
tehnologiei modern e care poate părea o complicare a activității comerciale pentru managerii și
angajații care au manageriat afacerea fără un astfel de sistem pentru perioade întinse de timp
de la câțiva an i la zeci de ani de activitate.
Această lucrare are ca scop descrierea implementării și realizarea unei soluții sof tware
bazată pe tehnologii web ș i mobile pentru management a unui magazin mic sau mijlociu , care
dorește să vină în ajutorul micilor comercianți, oferind o soluție simplu de utilizat la un co st
redus.Ide ea de a implementa o astfel de soluție de management, a venit în ur ma conștientizării
modului practic al unui astfel de sistem când am lucrat la magazinul familiei, nefiind obiș nuit
cu prețurile produselor fiind nevoit să părăsesc tejgheaua și să caut etichetele cu prețuri pe
rafturile cu produse din m agazin, astfel pierdeam timp atât eu câ t și clientul care e ra nevoit să
aștepte mai mult pentru a achita cumpărăturile.
Grupul ținta al acestei soluții este reprezentat de managerii și angajații u nui magazine
mic sau mijlociu care doresc să își aducă afacerea în era digitală și să crească astfel eficiența
și profitabilitatea activității pe care o desfășoară.
4
CAPITOLUL I. LIMBAJE ȘI TEHNOLOGII UTILIZATE
I.1. JAVA SCRIPT
JavaScript este un limbaj de programare orientat pe obiect e, bazat pe conceptul
prototipurilor. Este folosit mai ales pentru introducerea funcționalităților în paginile web,
codul JavaScript din aceste pagini este rulat de către browser. Acest limbaj este cel mai des
utilizat deoar ece programatorii web pot îngloba în paginile HTML script -uri pentru diverse
activități cum ar fi verificarea datelor introduse de utilizatori sau crearea de meniuri și alte
efecte animate.
Arborele de obiecte poartă numele de Document Object Model sau DO M. Există un
standard W3C pentru DOM -ul pe care trebuie să îl pună la dispoziție un browser, ceea ce
oferă premiza scrierii de script -uri portabile, care să funcționeze pe toate browserele.[1]
Un script scris în acest limbaj este un program inclus într -o pagină HTML. Textul
scriptului nu este afișat pe ecran, el fiind rulat și interpretat de browser. Browser -ul știe că
este vorba despre un program scris în Java Script atunci când întâlnește tag -ul și acționează în
consecință rulând și interpretând codul re spectiv.
A fost necesar să utilizez acest limbaj deoarece am dorit că aplicația să arate și să
funcționeze cel puțin la fel cu cele concurente.Utilizarea JavaScript în combinație cu HTML
duce la crearea unor pagini web cu un grad ridicat de interactivitat e.[1]
De asemenea alte tehnologii moderne utilizează limbajul JavaScript și permit
utilizarea acestuia. Utilizând Javascript putem induce utilizatorului sentimentul că datele sunt
manipulate și încărcate în timp real, deși durata încărcării și manipulării datelor este dată de
viteză internetului și de viteză raspunslui dat de baza de date dacă este cazul.
La realizarea lucrării de diplomă am folosit JavaScript pentru afișarea dinamică de
date, în cadrul framework -ului Angular alaturi de TypeScript pentru scrierea componentelor
în etapa de dezvoltarea aplicației și pentru API -uri care au fost dezvoltate folosind tot
limbajul JavaScript.
5
Figura I. 1 Mod utilizare Javascript din aplicație
I.2 TYPESCRIPT
TypeScript este un limbaj de programare open -source dezvoltat de compania
Microsoft. Acesta vine ca un superset pentru limbajul JavaScript și adaugă tipizare statică
opțională limbajului, astfel TypeScript este un limbaj mai puternic tipizat decât
JavaScript.TypeScript a fost conceput pentru dezvoltarea de aplicații mare ș i este compilat în
Javascript. Fiind un superset al Javascript programele javascript existente sunt de asemenea
programe TypeScript valide.[3]
TypeScript se compilează la codul JavaScript simplu și curat, care rulează pe orice
browser, în Node.js sau în orice motor JavaScript care acceptă ECMAScript 3 (sau mai
nou). Compilatorul TypeScript însuși este scris în TypeScript și compilat în Javascript. Este
licențiat sub licența Apache 2.[3] , [4]
TypeScript este inclus ca un limbaj d e programare de primă clasă în Microsoft Visual
Studio 2013 Update 2 și ulterior, alături de C # și alte limbi Microsoft. Tipurile permit
dezvoltatorilor JavaScript să utilizeze instrumente și practici de dezvoltare extrem de
productive, cum ar fi verificar ea statică și refactorizare atunci când elaborează aplicații
JavaScript. [3],[4]
Tipurile sunt opționale, iar inferența de tip permit câtorva adnotări de tip să aducă o
mare diferență verificării statice a codului. Tipurile vă permit să definiți interfeț e între
componentele software și să obțineți informații despre comportamentul bibliotecilor
JavaScript existente. [4]
La realizarea lucrării de diplomă am folosit TypeScript în aplicația client side
dezvoltata cu framework -ului Angular versiunea 6 , aces ta fiind principalul limbaj de
6
programare pe care Angular îl accepta și care este recomandat de către dezvoltatorii
framework -ului.
Figura I.2 Exemplu utilizare TypeScript din aplicație
I.3 NODE.JS
Node.js este un mediu run -time JavaScript, open -source și cross -platform , care
execută cod JavaScript server -side. Inainte de Node.js JavaScript era folosit pentru a scrie soft
care era utilizat în primul rând pe partea clientului, în care script -urile scrise în JavaScript sunt
încorporate în HTML -ul unei pag ini web și se execută în partea clientului de un motor
JavaScript încorporat în browser -ul web al utilizatorului.
Node.js permite dezvoltatorilor să folosească JavaScript pentru a dezvolta scripturi pe
partea de server, pentru a produce conținut web dinami c înainte de a ajunge pe browser -ul
utilizatorului, astfel Node.js repre zintă o paradigma "JavaScript peste tot", unificând astfel
dezvoltarea aplicațiilor web în jurul unui singur limbaj de programare atât pe partea de client
cât și pe partea de server .
Deși “.js “ este extensia convențională a fișierului pentru codul JavaScript, numele
"Node.js" nu se referă la un anumit fișier în acest context și este doar numele produsului.
Practic Node.js permite crearea de servere web și instrumente de rețea folos ind JavaScript și
o colecție de "module" care manipulează diferite funcționalități de bază.
Sunt furnizate modulele cu majorita tea funcțiilor de baza pentru:
✓ I/O pentru sistemul de fișiere I/O,
✓ rețele (DNS, HTTP, TCP, TLS/SSL sau UDP),
✓ date binare (bu ffer-uri),
✓ funcții criptografice,
7
✓ fluxuri de date
✓ alte funcții de bază.
Modulele Node.js utilizează un API proiectat pentru a reduce complexitatea scrierii de
aplicați server. Node.js este suportat oficial pe Linux, MacOS, Microsoft Windows, SmartOS,
FreeBSD și IBM AIX . Codul sursă furnizat poate fi de asemenea, construit pe sisteme de
operare similare sau poate fi modificat de terți pentru a sprijini alții, cum ar fi serverele
NonStop și Unix. Alternativ, ele pot fi scrise cu CoffeeScript (o alternati vă JavaScript), Dart
sau TypeScript (formua puternic tipizată a JavaScript) sau orice alt limbaj care poate fi
compilat în JavaScript. [5]
Node.js este folosit în principal pentru a construi programe de rețea, cum ar fi servere
web. Cea mai mare diferență d intre Node.js și PHP este că majoritatea funcțiilor în PHP sunt
blocante, comenzile se execută numai după încheierea comenzilor anterioare, codul este
executat în mod sincron), în timp ce funcțiile Node.js sunt non -blocante, comenzile se execută
simultan s au chiar în paralel (în mod asincron), și se folosesc apelurile înapoi (“callbacks”)
pentru a semnala finalizarea sau eșecul.
Node.js are o arhitectură bazată pe evenimente, capabilă de I/O asincron. Aceste
opțiuni de proiectare vizează optimizarea capaci tății și a scalabilității în aplicațiile web cu
multiple operațiuni de intrare / ieșire, precum și pentru aplicaț ii web în timp real ( programe de
comunicare în timp real și jocuri de browser). [5]
Arhitectura platformei Node.js aduce programare bazată pe ev enimente pe servere
web, permițând dezvoltarea de servere web rapide în JavaScript. Dezvoltatorii pot crea
servere extrem de scalabile fără a folosi fire de execuție, utilizând un model simplificat de
programare bazată pe evenimente care utilizează callbac k-uri pentru a semnala finalizarea
unei sarcini. Node.js conectează ușurința limbajului JavaScript cu puterea programării de
rețea Unix. Este extrem de rapid și competent cu fundamentele internetului, cum ar fi HTTP,
DNS, TCP. De asemenea, JavaScript a fos t un limbaj bine cunoscut, făcând Node.js accesibil
imediat pentru întreaga comunitate de dezvoltare web.
Există mii de biblioteci open -source pentru Node.js, cele mai multe dintre ele fiind
găzduite pe site -ul web www.npmjs.com. Comunitatea open -source a dezvoltat cadre web
(web frameworks) pentru a accelera dezvoltarea aplicațiilor. Astfel de cadre includ Connect,
Express.js, Socket.IO, Koa.js, Hapi.js, Sails.js, Meteor, Derby și multe altele.De asemenea, s –
au creat diferite pachete pentru interfața cu al te limbi sau cu medii de executare, cum ar fi
Microsoft .NET. [5]
8
La realizarea lucrării de diplomă am folosit Node.js pentru a creea aplicații server ,
API-uri web prin intermediul cărora se realizează comunicarea dintre aplicația care rulează
pe partea clientului și baza de date. Am ales Node.js deoarece sunt foarte familiar acesta și cu
limbajul JavaScript, serverele dezvoltate cu Node.js procesează foarte rapid cererile de la
aplicațile client astfel înbunătățind performanța întregului sistem.
I.4 AN GULAR
Angular este o platformă și un framework pentru crearea de aplicații client în HTML
și TypeScript. Angular însuși este scris în TypeScript. Acesta implementează funcționalitatea
de bază și opțională ca set de biblioteci TypeScript pe care le importați în aplicațiile dvs.
Blocurile de bază ale unei aplicații Angular sunt modulele Anglar (NgModules), care
oferă un context de compilare pentru componente. Modulele Angular colectează codul asociat
în seturi funcționale; o aplicație Angular este de finită de un set de module. O aplicație are
întotdeauna cel puțin un modul rădăcină care permite bootstrap ping și de obicei are multe alte
module de caracteristici.[6]
Componentele definesc view -uri, care sunt seturi de elemente de ecran pe care
Angular l e poate alege și modifica în funcție de logica programului și de date. Fiecare
aplicație are cel puțin o componentă rădăcină. Componentele utilizează servicii care oferă
funcționalități specifice care nu sunt direct legate de view -uri. Furnizorii de servic ii pot fi
injectați în componente ca dependențe, făcând codul modular, reutilizabil și eficient.
Atât componentele c ât și serviciile sunt pur și simplu clase, cu decoratori care
marchează tipul lor și oferă metadate care îi spun lui Angular cum să le folo sească.
Metadatele pentru o clasă de componentă o asociază cu un șablon care definește un view. Un
șablon combină codul HTML obișnuit cu directivele Angular și marcajul de legare care
permit lui Angular să modifice codul HTML înainte de al randa pentru afi șare. Metadatele
pentru o clasă de tip serviciu furnizează informațiile necesare lui Angular pentru a le pune la
dispoziția componentelor prin intermediul injecției de dependență (ID).[6]
Componentele unei aplicați i definesc de obicei multe view -uri, ara njate ierarhic.
Angular furnizează serviciul Router pentru a vă ajuta să definiți căile de navigare între views.
Router -ul oferă capabilități sofisticate de navigare în browser.
Angular definește NgModule (modulul Angular), care diferă și completează modu lul
JavaScript (ES2015). Un NgModule declară un context de compilare pentru un set de
componente care este dedicat unui domeniu de aplicație, unui flux de lucru sau unui set de
9
capabilități strâns legate. Un NgModule poate asocia componentele sale cu cod a sociat, cum
ar fi serviciile, pentru a forma unități funcționale. Fiecare aplicație Angular are un modul
rădăcină, denumit convențional AppModule, care oferă mecanismul de pornire care lansează
aplicația. O aplicație conține de obicei multe module funcțion ale. [6]
Ca și modulele JavaScript, modulele Angular pot importa funcționalități din alte
modulele Angular și poate permite ca propriile lor funcționalități să fie exportate și utilizate
de alte modulele Angular. De exemplu, pentru a utiliza serviciul de r outer în aplicația dvs.,
importați NgModul -ul Router. Organizarea codului în module funcționale distincte ajută la
gestionarea dezvoltării de aplicații complexe și la proiectarea pentru reutilizare. În plus,
această tehnică vă permite să profitați de încăr carea leneșă – adică încărcarea modulelor la
cerere – pentru a minimiza cantitatea de cod care trebuie încărcată la pornire.
Fiecare aplicație Angular are cel puțin o componentă, componenta rădăcină care
conectează o ierarhie de componente cu pagina DOM. F iecare componentă definește o clasă
care conține datele aplicației și logică și este asociată cu un șablon HTML care definește un
view care trebuie afișată într -un mediu țintă.[6]
Decoratorul @Component identifică clasa imediat sub ea ca o componentă și
furnizează șablonul și metadatele specifice componentei.
Un șablon combină HTML cu marcajul Angular care poate modifica elementele
HTML înainte de a fi afișate. Directivele de șabloane oferă logica programelor, iar marcajul
de legare leagă datele dvs. de a plicație și modelul obiect de documente (DOM). Legarea
evenimentului permite aplicației dvs. să răspundă la intrarea utilizatorului în mediul țintă prin
actualizarea datelor din aplicație. Legarea proprietății vă permite să interpolați valorile
calculate d e la datele aplicației în HTML.
Înainte de afișarea unui view, Angular evaluează directivele și rezolvă sintaxa de
legare din șablon pentru a modifica elementele HTML și DOM, în conformitate cu datele și
logica programului. Angular acceptă legarea datelor bidirecționale, ceea ce înseamn ă că
modificările din DOM, cum ar fi alegerile utilizatorilor, pot fi reflectate și în datele de
program. Șabloanele pot utiliza, de asemenea, conducte pentru a îmbunătăți experiența
utilizatorului prin transformarea valorilor pentru afișare. Utilizați con ductele pentru a afișa, de
exemplu, datele și valorile valutare într -un mod adecvat localizării utilizatorului. Angular
oferă conducte predefinite pentru transformări comune și puteți defini și conducte. proprii.[6]
Pentru date sau logică care nu sunt asoc iate cu un anumi view și pe care doriți să le
partajați între ele, creați o clasă de serviciu. O definiție a clasei de servicii este imediat
10
precedată de decoratorul @Injectable. Decoratorul furnizează metadatele care permit
serviciului dvs. să fie injecta t în componentele clientului ca o dependență.
Injecția de dependență (sau DI) vă permite să păstrați clasele de componente mai clare
și mai eficiente. Nu prelucrează date de la server, nu validează intrarea utilizatorului sau nu se
înregistrează direct în consola; aceștia deleagă astfel de sarcini serviciilor.[6]
Modulul Angular Router oferă un serviciu care vă permite să definiți o cale de
navigare între diferitele stări de aplicații și să ierarhiile de views din aplicație Router -ul
mapează căi de tip UR L la views în loc de pagini. Când un utilizator efectuează o acțiune,
cum ar fi clic pe un link, care ar încărca o pagină nouă în browser, router -ul interceptează
comportamentul browserului și afișează sau ascunde ierarhiile de vizualizare.[6]
Dacă router -ul stabilește că starea actuală a aplicației necesită o anumită
funcționalitate și modulul care o definește nu a fost încărcat, router -ul poate încărca leneș
modul la cerere. Router -ul interpretează o adresă URL a unui link în conformitate cu regulile
de navigare pentru view -urile aplicației dvs. și cu starea datelor. Puteți naviga la view -uri noi
atunci când utilizatorul face clic pe un buton, selectează o căsuță dintr -un meniu derulant
(dropdown) sau ca răspuns la un alt stimulent din orice sursă.
Route r-ul înregistrează activitatea în jurnalul istoric al browser -ului, astfel încât și
butoanele de înainte și de înapoi funcționează la fel. Pentru a defini regulile de navigare, se
asocia ză căile de navigare cu componentele.
La realizarea lucrării de diplo mă am folosit Angular pentru a crea aplicația pentru
parte de client prin intermediul căruia utilizatorul interacționează cu restul sistemului. Toate
elementele de interfață grafică cu care utili zatorul lucrează sunt în această aplicație web
Angular, aceasta procesează toate operaț iile de introducere de date și de afișare a datelor prin
intermediu formularelor și view -urilor utilizate în diferitele componente.
Am decis să folosesc Angular versiunea 6 , acesta fiind cea mai recent a versiune
disponibilă la momentul dezvoltării aplicați ei, deoarece conține multiple îmbunătățiri față de
versiunile precedente, de asemenea Angular este foarte popular în rândul dezvoltatorilor de
aplicații web, iar această popularitate are un trend ascen dent, acesta fiind utilizat în produsele
multor companii consacrate din domeniul I T precum Google , Microsoft .
Am decis utilizarea acestei tehnologii pentru a -mi extinde cunoștințele despre
Angular,înainte de acest proiect a m utilizat Angul arJs prima vers iune de Angular numit și
Angular 1, baza t pe JavaScript, în alte proiecte utilizate în producție, dar începând cu
versiunew 2 Angular a fost rescris de echipa de zvoltatoare folosind TypeScript , introducând
11
diferențe majore de a rhitectură limbaj și sintaxă , a introdus nu meroase caracteristici noi și
câștiguri de performanța.
I.5 MongoDB
MongoDB este o bază de date NoSQL open -source orientată pe documente. Acestă
bază de date beneficiază de suport din partea companiei 10gen. MongoDB face parte din
familia de sistemelor de baze de date NoSQL. Diferența principală constă în faptul că stocarea
datelor nu se face folosind tabele precum într -o bază de date relațională, MongoDB stochează
datele sub formă de documente JSON cu scheme dinamice. [7]
MongoDB acceptă interogări de câmp, interogări pe intervale și expresii regulate.
Interogările pot returna anumite domenii ale documentelor și includ funcții JavaScript definite
de utilizator. Interogările pot fi, de asemenea, configurate pentru a returna un eșantion
aleatoriu de rezultate de o anumită dimensiune. Indexarea câmpurile dintr -un document
MongoDB poate fi realizata cu indici primari și secundari. [7]
MongoDB oferă disponibilitate ridicată cu seturi de replici. Un set de replici constă
din două sau mai multe copii ale datelor. Fiecare membru al setului de replici poate acționa
oricând în rolul replicii primare sau secundare. Toate operațil ie de scriere și citire se
efectuează în mod implicit pe replica primară. Replicile secundare mențin o copie a datelor
primare folosind replicarea încorporată. Atunci când o replică primară eșuează, replica setată
efectuează automat un proces electoral pentru a determina ce secundar ar trebui să devină
primar. Replicile secundare pot opțional furniza informați ile pentru operații de citire.
Scalarea MongoDB se face orizontal folosind sharpening. Utilizatorul alege o cheie
shard, care determină modul în care datele vor fi distribuite într -o colecție. Datele sunt
împărțite în intervale (bazate pe cheia shard) și d istribuite pe mai multe sharduri. (Un shard
este un maestru cu unul sau mai mulți sclavi). În mod alternativ, cheia shard poate fi
împrăștiată pentru a realiza o mapare spre un shard – ceea ce permite distribuirea uniformă a
datelor. [7]
MongoDB poate rula pe mai multe servere, echilibrând încărcarea sau duplicarând
datele pentru a menține sistemul în funcțiune în caz de defecțiuni hardware.
MongoDB poate fi folosit ca sistem de fișiere numit GridFS, cu funcții de echilibrare a
încărcăturii și de replicare a datelor pe mai multe mașini pentru stocarea fișierelor. Această
funcție, denumită sistem de fișiere de grilă, este inclusă în driverele MongoDB. MongoDB
expune dezvoltatorilor funcții de manipulare a fișierelor și de conținut. GridFS împarte un
fișier în părți sau bucăți și stochează fiecare dintre aceste bucăți ca un document separat. [7]
12
MapReduce poate fi utilizat pentru procesarea în serie a operațiilor de date și
agregare. Cadrul de agregare permite utilizatorilor să obțină tipul de rezultate pentru care se
utilizează clauza SQL GROUP BY. Operatorii de agregare pot fi strânși împreună pentru a
forma o conductă – analogă conductelor Unix. Cadrul de agregare include operatorul de
căutare $lookup , care poate să unească în document din mai multe documente , precum și
operatori statistici, cum ar fi abaterea standard.
JavaScript poate fi folosit în interogări, în funcții de agregare (cum ar fi MapReduce)
și trimis direct la baza de date ca să fie executată.MongoDB acceptă colecții cu dimensiuni
fixe numite colecții cu capac. Acest tip de colecție menține ordinea inserți ei și, odată ce
dimensiunea specificată a fost atinsă, se comportă ca o coadă circulară. [7]
Versiunea curentă stabilă nu acceptă tranzacțiile, dar tranzacțiile sunt programate să
fie disponibile într -o nouă versiune majoră. (Candidatul de lansare 4.0.0 es te deja disponibil)
La realizarea lucrării de diplomă am folosit MongoDB ca să stochez toate informați ile
necesare în aplicație. Am ales MongoDB datorita rapidității operaților de scriere și citire și
datorita faptului că îmi este o baza de date foarte cun oscută pe care am utilizat -o în diverse
proiecte.
I.6 HTML 5
HTML este un limbaj de marcare utilizat pentru crearea paginilor web ce pot fi afișate
într-un browser. Scopul HTML este de a prezenta informații: para grafe, fonturi, tabele decât
de a descrie semantica documentului. HTM L este prescurtarea de la Hyper Text Mark -up
Language și este codul care stă la baza paginilor web. Specificațiile HTML sunt dictate de
World Wide Web Consortium (W3C). [8]
HTML este un format text proiectat pentru a putea fi citit și editat de oameni utilizând
un editor de text simplu. Totuși scrierea și modificarea paginilor în acest fel este
consumatoare de timp și solicită cunoști nțe avansate de HTML.Paginile HTML sunt formate
din etichete sau tag -uri și au extensia .html sau .ht m. Majoritatea acestor etichete sunt
pereche, una de deschidere <eticheta> și alta de închidere </eticheta>, mai există și cazuri în
care nu se închid, atunci se folosește <eticheta />. Browser -ul interpretează aceste etichete
afișând rezultatul pe ecran.
HTML5 este a cincea revizuire a standardului HTML (creat în 1990 și standardizat ca
HTML4 din 1997) și, din octombrie 2011, este în curs de dezvoltare. Obiectivele sale
principale au fost acelea de a îmbunătăți limbajul cu un suport pentru cele mai recente apariții
multimedia, în același timp menținându -l ușor de citit de către oameni și bine înțeles de către
13
computere și device -uri (browsere web, parsere ). HTML5 își propune să însumeze nu numai
HTML4, dar și XHTML1 și DOM2HTML (îndeosebi JavaScript). [9]
HTML5 include modele detaliate de prelucrare pentru a încuraja mai multe
implementări interoperabile; extinde, îmbunătățește și raționalizează disponibilitățile pentru
documentele web și introduce marcarea și aplicații API (application programming interfac es)
pentru aplicații web complexe.
Din aceste motive HTML5 este un posibil candidat pentru aplicațiile de platforme
mobile. Multe caracteristici ale HTML5 au fost create din considerarea că va trebui să devină
capabil să ruleze pe dispozitive cum ar fi sm art-phone -urile sau tabletele.
În special, HTML5 aduce multe noi caracteristici sintactice. Acestea cuprind elemente
ca <video>, <audio>, <header>și <canvas> elemente HTML, precum și integrarea
conținutului SVG care înlocuiește utilizarea tag -ului generic <object>. Aceste noutăți sunt
proiectate pentru a facilita includerea și manipularea în web a conținuturilor multimedia și
grafice fară a fi nevoie să se recurgă la proprietățile de plugin și API. [9]
Alte noi elemente ca <section>, <article>, <header>și <n av> sunt proiectate să
îmbunătățească conținutul semantic al documentelor. Noi atribute au fost introduse cu același
scop, în același timp unele elemente și atribute au fost îndepărtate. Unele elemente ca
<a>,<cite> și<menu> au fost schimbate, redefinite ș i standardizate. API -urile și DOM -urile
(Document Object Model) sunt certitudini și sunt părți fundamentale în specificațiile HTML5.
La realizarea lucrării de diplomă am folosit HTML5, fiind prezente noile elem ente
<section>, <nav> ,<video>, <canvas> și de asemenea toate șabloanele predefinite utilizate de
Angular sunt scrise cu HTML5.
I.7 CSS și SASS
Cascading Style Sheets, sau CSS pe scurt, este un standard simplu, ce oferă
designerilor/programatorilor un mod eficient de a controla modul de prezentare a p aginilor
WEB . CSS este, în mod primar, un limbaj folosit exclusiv doar pentru "web design", însă nu
putem exclude faptul că acest limbaj este folosit și în alte medii de programare.În comparație
cu anii 90, când controlul prezentării unei pagini se făcea p rin tag -uri HTML, divizate între
ele în mai multe fișiere, ce confereau o muncă enormă în cazul unei actualizări, CSS vine cu
un nou standard, și anume ca printr -un singur fișier să fie controlat întreg aspectul proiectului
WEB. [10]
Syntactically awesome style sheets sau Sass este un limbaj de foi de stil conceput
inițial de Hampton Catlin și dezvoltat de Natalie Weizenbaum. Practic Sass este un limbaj de
14
scripting preprocesor care este interpretat sau compilat în foi de stil cascadă (CSS – Cascading
Style Sheets).
Sass este o extensie a CSS care adaugă putere și eleganță limbajului de bază. Permite
utilizarea de variabile, reguli imbricate, mixuri, importuri inline și multe altele, toate cu o
sintaxă completă compatibilă cu CSS. Sas s ajută la păstrarea foilor de stil mari bine
organizate și rularea rapidă a foilor de stil mici, în special cu ajutorul bibliotecii de stil
Compass. [11]
Sass acceptă un mic set de extensii numite SassScript, acesta este limbajul de scripting
în sine , ace sta permite proprietăților să utilizeze variabile, aritmetică și funcții suplimentare.
SassScript poate fi folosit în orice valoare de proprietate. SassScript poate fi, de asemenea,
utilizat pentru a genera selectori și nume de proprietăți, care este util atunci când scrieți
mixuri .
Caracteristicile Sass:
✓ complet compatibil cu CSS
✓ extensii de limbă, cum ar fi variabilele, liste, imbricarea și grupuri
✓ suportă 8 tipuri de date (numere, secvența de text,culori, booleans, nulls, listă
de valori, mapări de valori, referință de funcție)
✓ multe funcții utile pentru manipularea culorilor și a altor valori
✓ caracteristici avansate precum directivele de control pentru biblioteci
✓ o ieșire bine formatată și personalizabilă [11]
La realizarea lucrării de diplomă am folosit CSS și mai ales Sass pentru stilizarea
paginilor web din aplicația de pe partea de client, Angular. Sintaxa mai scurtă și intuitivă și
extensile aduse de Sass sunt foarte utile ș i cresc semnificativ viteza de stilizare a paginilor
web și nivelul de reutilizare a stilurilor.
Utilizarea variabilelor pentru stocarea culorilor facilitează schimbarea rapida și ușoara
a tematici cromatice a aplicație, modificând doar o linie dintr -un fișier de stil unde variabilei
de culoare îi este atribuită valoare.
Am creat câ te o foaie de still, Sass, pentru fiecare componentă care apare în pagina
web cea ce îmi permite modificarea rapidă a stilului oricărei componente și un management
mult mai facil al stilurilor din aplicație.
15
CAPITOLUL II. TIPURI DE SOFTWARE UTI LIZATE
II.1 VISUAl STUDIO CODE
Visual Studio Code (VSCode) este un editor de cod sursă dezvoltat de Microsoft care
poate fi rulat pe Windows, MacOS și Linux. Este gratuit, open -source și oferă suport pentru
depanare, precum și controlul versiunii Git încorporat, evidențierea sintaxei, snipplet -uri și
așa mai departe. Interfața de utilizare a VSCode este foarte personalizabilă, deoarece
utilizatorii pot comuta la diferite teme, comenzi rapide de la tastatură și preferințe.VSCode a
fost inițial anunțat î n 2015 ca un proiect open -source găzduit pe GitHub, a fost lansat pe web
un an mai târziu. De atunci, editorul de cod Microsoft a câștigat popularitate printre
dezvoltatori. [11],[12]
VSCode primește actualizări lunare, utilizatorii se pot aștepta să se bu cure de o
experiență tot mai buna, fixuri de bug -urile, creșterea stabilității și a performanțelor sunt
efectuate frecvent.O caracteristica foarte apreciată a VSCode este suportul pentru modulele de
extensii, acesta permite instalarea de astfel de module care adaugă funcționalitate nou IDE –
ului. Astfel de module de extensie pot fi: module p entru evidențierea sintaxei, li tere, suport
pentru un limbaj specific, depanatoare și alte servicii externe.
Figura II.1 Mod u tilizare Visual Studio Code în aplicați e
VSCode împarte suprafața de lucru în 3 parți:
✓ bara de meniu din stânga ecranului – aceasta prezintă mai multe butoane care
modifică conținutul din fereastra din dreapta acesteia.
✓ fereastra din stângă – în funcție de opțiunea aleasă aici se afișează structura
proiectului, meniul de cautare în toata aplicatia deschisa, fișierele modificate
16
detectate de Git, comenzile de depanare sau extensile instalate și s ugestii de
extensii noi. Pot apă rea și alte opțiuni adaugate de extensile instalate.
✓ fereastra d in dreapta – conține în partea de sus lista cu fișierele recent deschise
și în restul ecranului este editorul propriu zis
Am ales să utilizez VSCode deoarece este un IDE gratuit, are suport integrat pentru
JavaScript, TypeScript și Node.js limbaje utili zate în dezvoltarea acestei lucrari, de asemenea
am instalat modulele de extensie pentru evidențierea sintaxei, lintere pentru JavaScript și
TypeScript care detectează erori înainte de compilare și sugerează corecții, auto -formatoare
de cod pentru a aranj a codul.
II.2 GIT
Git este un sistem de revision control care rulează pe majoritatea platformelor, inclusiv
Linux, POSIX, Windows. Git este un sistem distribuit și nu întreține o bază de date comună.
Este folosit în echipe de dezvoltare, în care membrii echipei acționează o arecum independent
și sunt răspândiți pe o arie geografică mare.Git este dezvoltat de Junio Hamano, fiind publicat
sub licență GPL și este considerat software liber.
Câteva proiecte majore care folosesc Git: Linux, Android, Debian, DragonFly BSD,
Eclipse , Fedora, GIMP, Linux Kernel, Linux Mint, openSUSE, Perl, phpBB, Qt, Ruby on
Rails, Samba. [13]
Dezvoltarea Git a început după ce mai mulți developeri ai nucleului Linux au renunțat
la sistemul de revision control proprietar BitKeeper. Posibilitatea de a utiliza BitKeeper
gratuit a fost retrasă după ce titularul drepturilor de autor a afirmat că Andrew Tridgell a
încălcat licența BitKeeper prin acțiunile sale de inginerie inversă. La conferința
Linux.Conf.Au 2005, Tridgell a demonstrat în timpul discursulu i său că procesul de inginerie
inversă pe care l -a folosit a fost pur și simplu o sesiune telnet pe portul corespunzător al
serverului BitKeeper și rularea comenzii help pe server. [13]
Controversa a dus la o renunțare rapidă la sistemul BitKeeper care a fost înlocuit cu un
nou sistem intitulat Git construit special pentru scopul de revision control în cadrul proiectului
Linux kernel. Dezvoltarea noului sistem a fost începută de Linus Torvalds în 3 aprilie 2005
pentru a fi anunțat câteva zile mai târziu (a prilie 6) pe lista de email a proiectului Linux
kernel. O zi mai târziu, noul sistem a început să fie folosit pentru dezvoltarea actuală de cod
pentru proiectul Git.
17
Primele operații merge au avut loc pe data de 18 aprilie. În data de 16 iunie, versiunea
2.6.12 Linux kernel a fost pusă în Git care continuă și în ziua de azi să fie sistemul revision
control folosit de proiectul Linux kernel. [13]
Figura II. 2 Exemplu utilizare Git în aplicație
La realizarea proiectului de licență am ales să folosesc Git pentru siguranța de a nu
pierde proiectul și pentru a avea acces la versiunile anterioare de dezvoltare a aplicației.Pentru
a putea utiliza GIT a fost necesară descărcarea și instalarea programului. După instalare a
apărut opțiunea de GIT Bas h atunci când se face click -dreapta într -un folder.Comenzile de
GIT utilizate cel mai frecvent pe parcursul dezvoltării acestei aplicații au fost:Git status,Git
add . , Git commit –m “mesaj de commit”, Git pull origin development, Git push origin
developme nt, Git checkout master, Git merge development.
II.3 VISUAL STUDIO TEAM SERVICES
Visual Studio Team Services sau VS TS este un set de servicii menite să ajute echipele
de dezvoltatori de software. V STS dispun de instrumente și roluri speciale pentru
dezvoltatorii de software, testeri și specialiști. Acestea includ instrumente pentru colaborare,
raportare, dezvoltare și măsurare.
Printr e servici ile oferite se găsesc servicii de versionare a codului și de web hosting
pentru proiecte, similare cu cele oferite de G itHub.Microsoft oferă pentru VS TS conturi
gratuite cu un numă r nelimitat de depozităr i private (care pot avea un numă r maxim de 5
utilizatori).
18
La realizarea proiectului de diplomă am activat servic iile VSTS folosind contul
Microsoft personal și am primit un spațiu de depozitare pentru proiect putând reveni oricând
la una dintre versiunile anterioare în cazul unei erori și posibilitatea de accesare de pe alte
calculatoare la proiectului.
Figura II.3 U tilizare Vi sual Studio Team Services pentru aplicație
II.4 POSTMAN
Postman este un client REST popular care facilitează dezvoltatorilor să creeze, să
partajeze, să testeze și să documenteze API -uri. Acest lucru se face permițând utilizatorilor să
creeze și să salveze cereri HTTP/s simple și complexe, precum și să citească răspunsurile lor,
să seteze variabile și medii de testare sau să creeze server de test . De asemenea permite
gruparea cererilor HTTP/s în colecții care pot fi partajate cu ceilalți membri echipei de
dezvoltare sau pot fi exportate și transmise altor pers oane se pot crea și spații d e lucru
separate care să conțină colecți ile. Astfel muncă mai este eficientă și mai puțin obositoare.
Postman permite crearea de conturi pentru acesta, după logare colecți ile create sunt trimise la
un API Postman și stocate ast fel la logarea în aplicație pe alt calculator aceasta se
sincronizează cu serverul și colecți ile utilizatorului sunt descărcate.
La realizarea proiec tului de diplomă am utilizat ap licația Postman în procesul de
dezvoltare a API -urilor RESTfull din lucrare și pentru testarea acestora. Am mai folosit
aplicația și pentru alte proiecte având multe colecții pe spațiul principal de lucru, am creat un
alt spațiu de lucru cu o colecție pentru acest proiect. colecția conține cate un folder cu cererile
HTTP/s pentru fiecare API.
19
Figura II.4 Mod utilizare Postman pentru aplicație
II.5 DOCKER
Docker este o platformă de containere foarte populară, aceasta permite împachetarea
unei aplicați cu tot ce are nevoie, de la sistemul de operare în sus, într -o singură unitate pe
care o poți partaja și rula pe orice computer (PC, Server ) care are Docker. [16]
Docker rulează aplicația într -o componentă ușoară, izolată numită container. Forma
împachetată a aplicației se numește imagine Docker , are de obicei câteva zeci sau sute de
mega -octeți , astfel sunt ușor de stocat și de mutat. Când rulați un container din imagine, va
începe în câteva secunde și procesul de aplicare se execută efectiv pe gazdă, ceea ce înseamnă
că puteți rula sute de containere pe o singură mașină. [15]
Docker este open source și cross -platform, iar unul dintre aspectele cele mai
convingătoare ale ecosistemului său este Docker Hub – un registru public în care organizațiile
și persoanele fizice împărtășesc propriile imagini ale containerului de aplicații. Pe Docker
Hub se găsesc imagini oficiale, acceptate pentru tehnologii populare, cum ar fi Nginx,
MariaDB, MongoDB și Redis, alături de imagini personalizate ale comunității și se pot
partaja proprile imagini. [15]
La realizarea lucră rii de diplomă am deci s să folosesc Docker pentru a crea imagini și
containere docker pentru aplicațile utilizate , de asemenea baza de date MongoDB utilizată
rulează într -un container Docker care a fost lansat folosind imaginea oficială Mongo de pe
Docker Hub. Am folosit ș i une alta docker -compose oferită de Docker , aceasta îmi permite ca
folosind un singur fișier, “docker -compose.yml” să îmi configurez mai multe imagini docker,
20
ale API -urilor dezvoltate și a bazei de date, și să le pornesc pe toate cu o sin gură comandă din
termi nal, comanda ‘docker -compose up’ .
Figura II.4 Mod utilizare Docker în aplicația implementată
21
CAPITOLUL III. PROIECTAREA ȘI IMPLEMENTAREA APLICAȚIEI
III.1 PROIECTAREA APLICAȚIEI
Ideea pentru această soluție mi -a venit în timp ce lucram la magazinul familiei, acesta
fiind un simplu ABC din mediul rural, prețurile produselor erau afișate pe etichetele de pe
raft, iar eu nefiind famili ar cu prețul produselor datorită faptului că ajutam doar la sfârșit de
săptămână câteva ore și a modificării constante a prețurilor trebuia să merg la rafturi și să caut
prețul produsului dacă nu mi -l aminteam, fapt care m -a frustra t enorm mai ales când erau mai
mulți clienți care așteptau.
Atun ci m-am gândit că ar fi util să pot scana codul de bare al produsu lui cu telef onul
pentru a primi prețul, de la această prima idee am continuat să dezvolt conceptul și să adaug
noi funcționalități, ajungând la o funcționalitate de casă de marcat iar apoi la conceptul final
de soluție web de manage ment al unui magazin, care să necesi te efort minim de instalare din
partea utilizatorului și hardware uzual pe care acesta probabil îl deține și îl utilizează zilnic,
adică un laptop sau un smartphone.
M-am documentat despre codurile de bare și modul în care funcționează acestea și am
căutat posibile astfel de soluții existente, am găsit c âteva soluții de management și software de
case de marcat dar toate necesitau sisteme hardware standard de case de marcat din domeniu,
iar instalarea trebuia efectuată de o echipa de specialiști.
Deoarece do ream ca acest sistem de m anagement să fie o soluție web, am decis să
folosesc teh nologiile cu care eram familiar, astfel am al es să utilizez MEAN stack adică:
Mongo, Express, Angular și Node.
Am utilizat o abordare de tip Mod el-First în proiectarea soluți ei, astfel am început prin
a schița modelul documentelor pe care urma să le stochez în baza de date și colecțiile de
documente necesare.
Având o viziune asupra bazei de date am continuat prin a proiecta structura de
ansamb lu a întregii soluții, am decis să urmez o arhitectură bazată pe micro -servicii RESTfull.
O astfel de arhitectură presupune descompunerea soluției software în mai multe micro –
servici i autonome care pot să colabore ze între ele. În ac eastă abordare fiecare micro -serviciu
realizează un se t de funcționalități bine definit ș i strâns legate între ele. De exemplu în această
22
soluție am un micro -serviciu pentru produse, toate operați ile care au loc asupra produselor din
baza de date se fac de către acest micro -serviciu.
REST, sau REpresentational State Transfe r (Transfer de Stare Reprezentațional),
reprezintă un stil arhitectural care furnizează standard e între servici ile de pe web,
simplificând comunicarea între acestea. Servic iile compatibile REST, deseori numite sisteme
RESTful l, se caracterizează prin modul în care acestea sunt independente de stare și separă
preocupările clientului și serverului. Această separare permite ca servici ile să ruleze
independent fără a cunoaș te starea celorlalte servicii cu care comunica trebuie cun oscut doar
formatul m esajului care trebuie transmis î ntre acestea. Folosind o interfața de tip REST mai
mulți clienți pot apela ace eași rută , efectua acelea și acțiuni și primii aceleași ră spunsuri.
Microserviciile sunt dezvoltate și lansate ca și containere în mod independent unele de altele.
Aceasta înseamnă că o echipă de dezvoltare poate dezvolta și desfășura un anumit
microserviciu fără a afecta alte subsisteme ale aplicației. Câteva avantaje ale arhitecturii
bazată pe microservicii:
➢ Sunt simplu de lansat în producție, sunt lansate în bucăți fără a afecta alte servicii;
➢ Sunt mai ușor de înțeles, codul este mai ușor de urmărit, funcționalitatea fiind izolată
și cu puține dependențe;
➢ Sunt reutilizab ile se rviciile mici precum cele de plă ți sau de logare pot fi partajate;
➢ Izolare rapidă a defectelor, când un t est pică sau un serviciu eșuează acesta poate fi
rapid identificat;
➢ Minimalizează riscul schimbării, fiind independente unele de altele servici ile pot fi
scrise în limbaje diferite și pot folosii tehnologii diferite.
Netflix, eBay, Amazon, Twitter, PayPal și alte vedete de tehnologie au evoluat de la
arhitectura de tip monolit la arhitectura bazată pe microservicii. Cu partea de server
proiecta tă am trecut la partea de client, aici am î nceput prin a determina principalele pagini
web necesare și prin a schița designul acestora.
III.2. STRUCTURA APLICAȚIEI
Aplicația după o descompunere clasică Client -Server este compusă dintr -o aplicație
Angular pe partea de client ș i trei servici scrise ca și API -uri în Node.js și Express.js
împreună cu baza de date Mongo pe partea de Server.
23
Figura II.1 Componentele aplicației și rutele de comunicare ale acestor a
III.2.1 STRUC TURA UNUI SERVICE API
Structura de bază este o structură arborescentă în care fiecar e director și fișier a u un nume
sugestiv .
Figura II.2 Structura de fișiere a
unui API
Figura II.3 Structura de fișiere din
directorul src pentru Users API
24
În figura II.2 se observă struc tura unui Serviciu API din cadr ul proiectului, toate fișierele
și directoarele fiind re găsite într -un director rădăcină .
Principale le directoare din această figură sunt:
➢ Directorul src – aici se gasesc sub -directoarele cu fisierele de bază din cadrul
aplicației, acestea sunt numite sugestiv.
✓ Directorul controllers – sici se gasesc fișierele care conțin logica complexă
din API, aceea de acceptare a cererilor și procesare a acestora , a datelor
necesare formulă rii răspunsului și trimiterii răspunsului .
✓ Directorul dal – prescurtare de la Data Acces Level (Nivel de acces la date)
acesta conțin e fișierele cu func ționalit ății care operează la nivelul datelor din
baza de date , funcțile de scriere și citire în/din baza de date.
✓ Directorul helpers – conține fișiere cu funcții utilitare care sunt utilizate în alte
funcții din API.
✓ Directorul models – conține fișiere le model care descriu structura unui
document dintr -o colec ție din baza de date MongoDB.
✓ Directorul routers – conține fișierele care conțin routerele aici sunt definite
rutele pe care se accept ă cererile și tipul acestora.
➢ Directorul auth -express – conține un modul de tip middleware utilizat în procesul de
autentificare și autorizare a cererilor HTTP/s recepționate. Cererile care nu prezintă
tokenul de autentificare sau care au tokenul neconform sunt respins e de acest modul
care returnează un ră spuns cu statusul 401 Neautorizat .
➢ Directorul node_ modules – conține multiple module și libră rii Javascript externe de
care serviciul este dependent pentru a func ționa correct ș i module utile în procesul de
dezvoltare și testare a acest uia.
În directorul radacină se mai găsesc câteva fișiere acestea sunt:
➢ index.js fișierul centra l al aplicație toate celelalte fi șiere sunt importate în
acesta el fiind punctul de pornire al aplicație.
➢ package.json – defineste modulul npm al serviciului, conține informații despre
dependințele ce trebuie instalate, date de ident ificare a modulului npm precum
numele , autorul, versiunea, punctu l de pornire (index.js), licența, posibilele
comenzi acceptate și posibila adresă a unui re gistru de stocare a codului sursă (
ex: github)
25
➢ Dockerfile – fișierul de definiț ie a imaginii dock er pentru acest serviciu
➢ gruntfile.js – fișier de configurare pentru taskrunerul grunt folosit pentru a
rula linterele și testele
➢ fișierul .gitignore este unilizat penru a informa git ce directoare și fișiere nu
trebuie să atașeze repertoriului și pot fi ignorate, astfel de fișiere sunt cele din
directorul node_modules acestea sunt voluminoase și pot fi instalate rapid pe
oricare altă masina prin rularea comenzii npm install
➢ fisierul .dockerigno re este ut ilizat pen tru a inf orma docker ce directoare și
fișiere nu trebuie să atașeze imaginii docker în momentul creerii acesteia și pot
fi ignorate, din nou menționez directorul node_modules
➢ .env -fișierul care conține configură rile generale ale aplicației , aici se gă sesc
setări precum numele serviciului, portul pe care rulează, adresa și portul de
acces a bazei de date , tokenul de acces instant (utilizat de administratorii) și
alte configurarii.
Figura II.4 Conținutul fiș ierului . env
Toate API -urile dezvoltate în cadrul lucrării urmează ace astă structură prezentată mai sus.
26
III.2. 2 STRUCTURA APLICAȚIEI ANGULAR
Aplicația client -side Angular are o structură sta ndard tipică acestei platforme , ea a
fost generat ă automat în momentul inițializă rii proiectului.
Angular generează în directorul rădăcină câteva fișiere care conți n configurații pentru
platforma Angular, editorul de cod utilizat, compilatorul ș i linker -ul de TipeScript și trei
directoare principale , acestea sunt:
Figura II.5 Structura de fișiere a
aplicației Angular
Figura II.6 Structura de fișiere din
directorul app
27
➢ Directorul e2e acesta est e utilizat în testarea end -to-end a aplicație Angular , directorul
conține fișiere de configurare pentru Protractor , un cadru de lucru pentru dezvoltarea
și rularea de tes te e2e, și un alt director cu câteva fiș iere ce conțin exemple de astfe l de
teste;
➢ Directorul node_modules identic cu ce l prezentat în structura API -ului conține librării
cu module de baz ă angular și alte librarii externe impo rtate și utilizate în aplicație;
➢ Directorul src este cel mai important acesta conține codul aplicației client -side angular
propriu -zisă. Acesta conține propria structură de directoare și fișiere vizibilă în Figura
II.6, iar fișierele și directoarele princip ale sunt descrise în continuare:
✓ Fișierul index.html descrie structura HTML de bază a aplicației
✓ Fișierul main.ts reprezintă punctu l de start al aplicație i
✓ Fișiere styles.scss conțin codul Sass cu stilul general al aplicației
✓ Directorul assets este utilizat pentru a stoca elemente media utilizate în aplicați e
precum fișiere de logo, simboluri grafice , fișiere audio
✓ Directorul app conține modulele, componentele , servici ile și router -ele angular
dezvoltate .
▪ app.module.ts reprezintă modulul rădăcină al aplicației
▪ app.routing.module.ts este modulul router al apli cației
▪ fișierele care î ncep cu app.component formează componenta rădăcină a
aplicație i
Fiecare pagină web din aplicație est e o componentă Angular și se găsesc î n directorul
src/app cele mai im portante dintre acestea sunt:
➢ home – componenta care formează pagina principală
➢ login – pagina de logare î n aplicație
➢ products –pagina de administrare a produselor
➢ users – pagina de administrare a utilizatorilor
➢ sales – pagina d e vizualizare și editare a vânzarilor
➢ my-nav –componenta care formează meniul de navigare p rezent pe toate
paginile exceptâ nd pagina de logare
Directorul app/services conține serviciil e care se ocupă de comunicarea cu API-urile
web și servicii utilizate pentru a man ipula date. Cele mai importante sunt:
➢ auth.service.ts – serviciul care gestionează operaț iile de autentificare
➢ users.service.ts – gestionează operațiile legate de utilizatorii
➢ products.service.ts – realizează oper ațiile legate de produse
28
➢ sales.service.ts – realizează oper ațiile legate de vâ nzări
III.3. STRUCTURA BAZEI DE DATE
Baza de date folosită în această aplicație este de tip MongoDB e ste o bază de date de
tip NoSQL , datele nu sunt stocate sub forma de tabele ci sunt stocat e ca și documente JSON
cu schemă dinamică. Aceste documente sunt grupate în colecții , o bază de date poate conține
mai multe colecții de documente. Fiecare schem ă de document conține cel puțin un indice
unic după care poate fi identificat, dar se pot crea documente cu indici multip li sau compuși.
Respectând modelul arhitectural bazat pe microservicii fiecare API Servi ce din
aplicație comunic ă cu baza de date proprie numită după tipul modelului principal.
Figura II I.1 Structura bazelor de date MongoDB
În aceste baze de date sunt stocate toate datele utilizate în aplicație, ele fiind afișate prin
interogări ale acest ora.
29
Baza de date Users conține urmatoarele colecții:
➢ shops – conține documente cu informații legate de magazinele ca re utilizează
această aplicație pen tru management.
Fig. III.2. D ocument de tip shop
Modelul documentelor de tip shop conține urmă toarele câmpuri:
➢ _id : Int 32 – indicele unic al documentului
➢ name: String – numele magazinului
➢ createdAt: Date – data câ nd a fost creat documentul
➢ updatedAt: Date – data ultimei modificări
➢ deleted: Boolean – marchează documentul ca fiind șters (Am decis să
utilizez o abordare de “ștergere usoară” , documentele sunt doar marcate
ca fiind șterse, pot fi utilizate în scopuri statistice)
➢ users – conține documente cu informații legate de utilizatori i care utilizează
această aplicație, ac eștia sunt managerii și angajații magazinelor .
30
Fig. III .3. Document de tip user
Modelul documentelor de tip user conține urmatoarele câmpuri:
➢ _id : ObjectId – indicele unic al documentului
➢ name: String – numele utilizatorului
➢ email : String – adresa de email a utilizatorului
➢ password : String – parola sub for ma criptată autilizatorului
➢ role: String – rolul utilizatorului, poate fi: manager, employee sau a dmin
➢ adress : String – adresa utilizatorului
➢ phone : String –numă rul de telefon al utilizatorului
➢ shop_id : String – indicele magazinului pentru care lucrează utilizatorul
➢ birth_data : Data –data de naș tere autilizatorului
➢ createdAt: Date – data câ nd a fost creat documentul
➢ updatedAt: Date – data ultimei modificări
➢ deleted: Boolean – marchează documentul ca fiind șters
Baza de date Products conține colecția products – conține documente cu informații legate
de produsele comercializate de magazine.
31
Fig. III.4 . Document de tip product
Modelul documentelor de tip user conține urmatoarele câmpuri:
➢ _id : ObjectId – indicele unic al documentului
➢ name: String – numele produsului
➢ price : Int32/Double – prețul unei unită ți de produs
➢ barcode : Int32 – valoare codului de bare al produsului
➢ quantity : Int32/Double – cantitatea produsului
➢ unit_type : String –tipul de unitate de măsură al produsului , poate avea
următoarele valori: 'kg', 'meter', 'liter', 'piece'
➢ category: String – categoria produsului spre exemplu: a limente, s ucuri,
îmbrăcăminte
➢ shop_id : String – indicele magazinului de care aparține produsul
➢ createdAt: Date – data câ nd a fost creat documentul
➢ updatedAt: Date – data ultimei modificări
➢ deleted: Boolean – marchează documentul ca fiind șters
Baza de date Sales conține colecția sales – acasta conține documente cu informații legate
de vânză rile ef ectuate de magazine.
32
Fig. III . 5 Document de tip sale
Modelul documentelor de tip sale conține urmă toarele câmpuri:
➢ _id : ObjectId – indicele unic al documentului
➢ total: Int32/Double – valoarea vânzării efectuate
➢ employee: Object – obiect cu informații despre utilizatorul care a efectuat
vânzarea
▪ name: String – numele produsului
▪ emp_id : String – indicele unic al utilizatorului
➢ items : Array – conține obiecte cu detalii despre produsele vândute
▪ barcode : Int32 – valoare codului de bare al produsului
▪ quantity : Int32/Double – cantitatea de produs vândută
▪ unit_type: String –tipul de unitate de măsură al produsului
▪ price : Int32/Double – prețul unei unități de produs
▪ category: – categoria produsului
▪ prod_id: indicele produsului
➢ shop_id : String – indicele magazinului de care aparține vânzarea
➢ createdAt: Date – data câ nd a fost creat documentul
➢ updatedAt: Date – data ultimei modificări
➢ deleted: Boolean – marchează documentul ca fiind șters
33
III.4. IMPLEMENTAREA APLICAȚIEI
Prima dată când utilizatorul intră în aplicație acesta este redirectat către pagina de
login unde poate să -și intr oducă email -ul și parola și să i ntre în aplicație.
Fig. III .6 Captura pagini i de login
Pagina de login (figura III.6) are un design simplu ce conține un formular de logare .
Aici u tilizatorulu i i se cere să introducă email -ul și pa rolă pentru a continua.
Redirectarea pentru utilizatoru l neautentificat este realizată de serviciu l AuthGuard,
acesta fiind un serviciu care implementează clasa de tip interfața Angular CanActivete. A stfel
AuthGuard poate fi utilizat ca un middlware în declararea rutelor din aplicație , astfel îna inte
de a naviga la component a care reprezintă pagina respectiv ă router -ul trebuie să primească
aprobare de la acest serviciu.
Fig. III .7 Codul clasei AuthGuard
34
În Fig. III.7 se poate observa codul serviciu lui AuthGuard , acesta conț ine funcția
principală CanActivate care este apelată de router, și transmite acestuia raspunsul returnat de
funcția checkLogin. Aceasta din urmă comunică cu serviciul de autentificare (authService) ș i
verifică dacă utilizator ul este autentificat . În caz afirmativ returnează true și router -ul continuă
acțiunea de schimare a componentei , în cazul negativ router -ul este redirecti onat spre
componenta de login.
Fig. III .8 Utilizarea clasei AuthGuard în definirea rutelor
În Fig. III.8 se observa cum este folosit AuthGuard în definirea rutelor aplicației. Dacă
utilizatorul nu are cont trebuie să contacteze managerul magazinului pentru care lucrează și
acesta poate să îi creeze un cont nou.
Aplicațiile A ngular sunt de tip single page, acestea nu se reîncarcă, dec ât la cererea
explicită a utilizatorului, com ponentele angular iau locul paginilor web clasice, astfel în
momentul navigării spre o altă pagină nu se realizează o cerere spre server pentru șabl onul-ul
pagini, acesta este încă rcat de la început î n memori e doar datele care trebuie să populeze
șablonul sunt cerute de la servere.
În m omentul în care utilizatorul reî ncarcă pagina în mod explicit toate date le din
memorie se pierd și utilizatorul este redirecționat la pagina de logare unde trebuie să se
autentifice din nou, fapt care devine enervant și obos itor, mai ales în perioada de dezvoltare a
aplicație i cand reîncărcă rile sunt foarte frecvente. Pentru a rezolva această problemă am
implementat o logare persistent ă utilizând token e web JSON care sunt stocate în spațial de
stocare local al browser -ului.
Aceste toke ne conț in informatii despre utilizator care sunt utilizate în autorizarea
cererilor trimise că tre API -uri.
35
Fig. III .9 Codul funcție de autentificare client -side
În momentul inițializ ării pagini i de login se apelează funcția loginCall codu l este
prezentat în Fig III.9. Acesta verifică dac ă există obiectul token în spaț iul de stocare local,
dacă acesta exi stă token -ul este setat ca și încă rcatură pentru apelul funcției login din serviciul
_auth, care crează și trimite o cerere spre Use rs API . În funcție de ră spunsul primit se va
continua spre pagina principală sau se va afiș a un me saj de eroare. Dacă tokenul nu exist ă
utilizatorul nu a fost logat înainte iar în acest caz este necesară autentificarea manuală.
Users API verifică informația primită ș i transmite î napoi datele utilizatorul ui în caz de
succes sau mesaj de eroare dacă datele primite sunt eronate. În cazul în care primeș te token se
verifică semnă tura token -ului și datele conținute, iar pentru autent ificare cu email și parolă
caută mai întâ i email-ul în baza de date iar mai apoi compară p arola primită cu cea existentă
în baza de d ate. Dacă informația este validă se va genera un nou token cu datele utilizat orului
care va fi transmis cu ră spunsul cererii.
36
Fig. III .10 Codul fun cție de autentificare cu email și parolă în u sers-API
Toate servicile API dezvoltate verifică existență token -ului de acces prin intermediul
unui modul middlware dezvoltat pentru acest scop, numit auth -express, care este seta t pe
rutele acestora. Astfel câ nd prime sc o cerere mai întâ i acestea sunt trecute prin acest
middleware .
Fig. III .11 Codul funcție de autentificare a unui token din auth -expres
37
În figura III.11 se observă codul funcției principale din middleware -ul auth -express, se
apelează funcția de verificare a prezenței token -ului de autentificar e iar dacă acesta este
confirmat se continuă cu fu ncția de verificare a acestuia.
Doar rutele pentru cererile de autentificare nu utilizează acest modul deoarece la
autentificare este po sibil ca utilizatorul să nu aibă un token .
Modalitate utilizare middleware auth pe rutele din Users API:
app.use('/auth/', AuthRoutes);
app.use('/lic/', auth, apiRoutes);
Odată autentificat utilizatorul este redirecți onat la pagina princip ală și poate să vadă
paginile la care are acces în meniul de navigare derulant din partea stâ ngă a ecranului .
Fig. III .12 Meniul de navigare
38
În figura III.12 se observă meniul de navigare , el fiind accesibil de pe toate paginile
dacă utilizatorul este autentificat.
Elementele din meniu sunt afișate î n funcție de rolul utilizatorului, Managerii au acces
la toate paginile din aplicație iar angajații simpli doar la pagina principală (Home), pagina de
vânzări (Sales) , pagina de produse (Products) și pagina de editare a datelor propri i deschisă
prin selectarea numelui utilizatorului.
Pentru afișarea informaț iilor în meniul din partea stângă, diferența între utilizatori se
face exact în momentul afișă rii. Acolo se face o verificare folosind directiva A ngular *ngIf .
Codul element ului u sers din meniul de navigare :
<a mat-list-item *ngIf="_auth.isManagerOrAdmin" routerLink="users">Users</a>
Variabila _auth.isManagerOrAdmin are valoarea true dacă utilizatorul are rolul
Manager sau Admin și est e setată în momentul authentificarii utilizatorului.
Fig. III .13 Captură a paginii de produse
În figura III.13 este prezentată o captură a paginii Products , aici utilizatorul poate
vizuliza lista de produse din baza de date și poate adăuga, edita și șterge produsele.
39
Pentru adaugarea unu nou produs trebuie completat un formular cu urmă toarele date:
➢ Name – numele
➢ Price – prețul
➢ Barcode – codul de bare
➢ Quantity – cantitatea
➢ Unit type – unitatea de masură
➢ Category – categoria
➢ Location – locația
Acest formular est e folo sit atâ t pentru crearea cât ș i editarea produsului, în mo mentul
în care utilizatorul apasă butonul de editare formularul este completat automat cu datele
existente iar butonul de Add product este ascuns și î nlocuit cu butonul Save care invocă
funcția de sal vare a modifică rilor efectuate .
Produsele p ot fi filtrate după oricare din proprietățile afișate.
Fig. III .14 Codul funcției de salv are a produsului din aplicația A ngular
În figura III.14 este afișat codul funcție de salvare a produsului din aplicația Angular,
aceasta trimite o cerere la Products API cu datele din formular salvate în variabila
this.newProduct, cât timp se aș teaptă răspunsul de la API se afișează o animație de încărcare
în locul formularului, afiș area acesteia este condiționată de valoarea variabilei showSpinner.
Odată primit ră spun sul în caz de eroare se afiș ează mesajul de eroare, sub formular sau
dacă s-a creat cu succes noul produs este ad ăugat ca prima linie î n tabelul cu produse și
formularul este resetat la starea inițială .
40
Users – Pagina de utilizatori
Fig. III .15 Captură a paginii de produse
În figura III.15 este prezentată o captură a paginii Users, aici utilizatorul de tip
manager poate vizuliza lista de utilizatori care aparțin magazinului și poate adăuga, edita și
șterge utilizatori.
Pentru adă ugarea unu nou utilizator trebu ie completat u n formular cu urmă toarele date:
➢ Name – numele utilizatorului
➢ Emai l – emailul utilizat la aut entificare
➢ Password – parola de acces, utilizată la aut entificare
➢ Role – rolul utilizatorului
➢ Phone Number – numă rul de telefon
➢ Birth Date – data nașterii utilizatorului
➢ Adress – adresa domiciliului utilizatorului
Acest formular este folosit at ât pentru crearea cât și editarea utilizatorului , în mod
identic formularului din pagina de produse .
41
Home – Pagina principală
Fig. III .16 Captură a paginii principale
În figura III.16 este prez entată o captură a paginii Home , pagina principală, aceasta permite
utilizatorului să caute produse și să efectueze vânzarea acestora .
Pagina este formată din 3 componente:
➢ Tabela produselor din stoc
➢ Lista curent ă de produse selectate pentru vâ nzare
➢ Scannerul de coduri de bare
Tabela produselor din stoc permite utilizatorului vizualizarea produselor disponibile,
este asemenea tabelei din pagina de produse (Products) cu diferența câtorva coloan e care nu
sunt afișate. Prin apă sarea butonului din coloana de acțiuni utilizatorul adaugă produsul în
lista curentă de produse.
42
Fig. III .17 Codul funcț iei de adaugare a unui produs în lista curentă de produse
În figura III.17 este prezentat codul funcție i addProductToSale , aceasta adaugă un
produs la lista curent ă de produse. Pentru a nu se adăuga dubluri de produse, mai întâ i se
caută în listă după codul de bare, dacă p rodusul este prezent. În cazul în care este gă sit se
increm entează cantitatea acestu ia cu o unitate, dacă acesta nu este gă sit un nou element este
creat și adă ugat în listă .
Lista curent ă de produse selectate pentru vâ nzare conține t oate produsele selectate spre
vânzare, aceasta permite modificarea numă rului de pr oduse ce urmează să fie vândute, de
asemenea a fișează costul total al tuturor elementelor din listă.
Prin apă sarea butonului Sell din partea s tângă jos a listei funcția de vâ nzare este
apelată, aceasta transmite o cerere la Sales API pentru a înregistra vânzarea î n baza de date,
după care se transmite o altă cerere la Products API pentru a actualiza cantitatea rămasă a
produselor.
Scannerul de coduri de bare permite utilizatorului să scaneze codurile de bare ale
produselor folosind camera foto a dispoziti vului. O dată ce sa efectuat scanarea codul de bare
și dacă numele produsului a fost detectat vor fi afișat e, de asemenea produsul este adă ugat în
lista curent ă de produse selectate pentru vâ nzare ca o singură unitate.
43
Fig. III .18 Captura a scanerului de coduri de bare activat și a listei curente de produse
Pentru realizarea scanerului de coduri de bare am utilizat elementul HTML5 <video>
care primeș te datele de la camera disp ozitivului, aceste date sunt preluate folosind atributul
src și sunt transmise la serviciul BarcodeDecoderService care utilizează o librărie pentru
citirea de coduri de bare numită QuaggaJS, care procesează fluxul de date și returnează codul
de bare.
Sales – Pagina de vâ nzări
Aceasta pagină permite vizualizarea tuturor vânzarilor efectuate și modificarea sau
ștergerea acestora în cazul în care vânzatorul a greșit când a introdus numărul de produse la
efectuarea vânzării sau clientul dorește să returneze produsul. De asemene se poate vizualiza
suma totală a vânză rilor dintr -o zi sau un interval ales de utilizator, în mod standard se
afișează doar vâ nzările din ziua curentă pentru a vizualiza vânzările din alte zile se folosesc
două câmpuri de introduc ere a datelor de tip Dată, pe ntru data de start și pentru data de final.
44
Fig. III .19 Captura a pagini Sales
Vânzările sunt afișate după ordinea descrescătoare a da tei calendar istice astfel cea mai recentă
vânzare este prima din tabela afișată.
45
CONCLUZII
Managementul unui magazin este o activitate complexă și consumatoare de timp,
considerând faptul că într -o afacere timpul și informația înseamnă bani, o astfel de aplicație
ajută prin informarea rapidă a utilizatorului și prin reducerea timpului necesar ac tivității de
management.
Pe piață există multiple aplicații p entru manag ementul magazinelor, însă nu am gă sit
una care să nu necesite și componente hardware speciale vândute tot de furnizorul aplicație.
Aceasta aplicație a fost concepută pentru a ajuta magazinele mici și mijlocii.
La implementarea aplicației am încercat să implementez cele mai impor tante și
necesare funcționalităț i care țin de managementul unui magazin .
Printre avantajele pe c are le ofer ă aplicația implementată se numără : reducerea
timpului de m anagement al magazinului, și accesul permanent la informații datorită faptului
că aplicația poate fi accesată de oriunde, designul simplu al aplicației care facilitează
utilizarea acesteia chiar și de către persoa nele care nu sunt adepte ale te hnologiei.
Această aplicație este un prim pas pentru dezvoltarea pe viitor a unor funcționalități
mult mai complexe. Modul în care s-a lucrat la această aplicație permite dezvoltarea de noi
funcționalități, pr oiectul ș i baza de date având o structura bine organizată.
O posibilă dezvoltare a aplicației este crearea unei interfețe care să comunice cu casele
de marcat fiscale, o alta funcționalitate pe care o co nsider utilă ar fi adăugarea unui modul de
statistici, astfel încât managerii să poate urmări evoluția pieței în care operează.
În concluzie, managerii de mag azine o să gă sească această aplicație ca fiind foarte
utilă, în activitat ea de management pe care o desfăș oară. Prin utilizare ei o să crească eficiența
cu care își desfăș oară activit atea.
Scopul final al aplicației implementate în cadrul proiectului de diplomă este de a oferi o
soluție de management simplă și economică managerilor de magazine mici și mijlocii care să
nu necesite compo nente hardware costisitoare, ajutându -i în activitatea zilnică a acestora.
46
BILBIOGRAFIE
[1]https://digipedia.ro/despre -limbajul -javascript – data ultimei accesări 2018/06/19
[2]http://www.scritub.com/stiinta/informatica/html/Realizarea -paginilor -interacti13382.php –
accesat la data 2018/06/19
[3] https://en.wikipedia.org/wiki/TypeScript – accesat la data 2018/06/19
[4] https://www.typescriptlang.org/index.html – accesat la data 2018/06/19
[5] https://en.wikipedia.org/wiki/Node.js – accesat la data de 2018/06/20
[6] https://angular.io/guide/architecture – accesat la data de 2018/6/20
[7] https://en.wikipedia.org/wiki/MongoDB – accesat la data de 2018/6/20
[8] https://ro.wikipedia.org/wiki/HyperText_Markup_Language – accesat la data de 2018/6/20
[9] https://ro.wikipedia.org/wiki/HTML5 – accesat la data de 2018/6/20
[10 ] https://ro.wikipedia.org/wiki/Cascading_Style_Sheets – accesat la data de 2018/6/21
[11] https://sass -lang.com/documentation/file.SASS_REFERENCE.html – accesat la data de
2018/6/21
[12] https://en.wikipedia.org/wiki/Visual_Studio_Code – accesat la data de 2018/6/21
[13]https://code.visualstudio.com/docs – accesat la data de 2018/6/22
[14]https://ro.wikipedia.org/wiki/Git – accesat la data de 2018/6/22
[15] Elton Stoneman , Docker Succinctly , din seria de E -Books Succintly de Syncfusion , p.10
47
DECLARAȚIE DE AUTENTICITATE A
LUCRĂRII DE FINALIZARE A STUDIILOR
Titlul lucrării:
Aplicație web pentru managementul magazinelor
Autorul lucrării:
Tripon Teodor -Dorin
Lucrarea de finalizare a studiilor este elaborată în vederea susținerii
examenului de finalizare a studiilor organizat de către Facultatea de Inginerie
Electrică și Tehnologia Informației din cadrul Universității din Oradea, sesiunea
iulie a anului univers itar 2017 -2018 .
Prin prezenta, subsemnatul Tripon Teodor -Dorin, CNP: 1950807051154,
declar pe proprie răspundere că această lucrare a fost scrisă de către mine, fără
nici un ajutor neautorizat și că nici o parte a lucrării nu conține aplicații sau
studii d e caz publicate de alți autori.
Declar, de asemenea, că în lucrare nu există idei, tabele, grafice, hărți sau
alte surse folosite fără respectarea legii române și a convențiilor internaționale
privind drepturile de autor.
Oradea,
3.07.2018
Semnătura
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: PROGRAMUL DE STUDIU TEHNOLOGIA INFORMAȚIEI [613570] (ID: 613570)
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.
