Sunteți pe pagina 1din 43

Universitatea din Bucureti

Facultatea de Matematic i Informatic

LUCRARE DE LICEN
Dorminator Aplicaie Web-based

COORDONATOR TIINIFIC STUDENT


Murean Claudia Suditu George - Alexandru
CUPRINS

GENERALITI 4
CAPITOLUL 1. INTRODUCERE 6
1.1. Motivaie 6
1.2. Tema proiectului 6
CAPITOLUL 2. TEHNOLOGII 7
2.1. PHP 7
2.2. MySQL 8
2.3. CoffeeScript 8
2.4. jQuery 9
2.5. AJAX 10
2.6. HTML 10
2.7. CSS 11
2.8. Bootstrap 11
2.9. Laravel 11
CAPITOLUL 3. CONCEPTE TEORETICE 13
3.1. Concepte OPP 13
3.2. Concepte MVC 14
3.3. Expresii regulate 15
3.4. Structuri de date 15
3.4. Protocolul HTTP 15
3.5. UML: Use Case Diagrams 16
CAPITOLUL 4. SPECIFICAIILE APLICAIEI 17
4.1. Prezentare general a aplicaiei 17
4.2. Implementare 17
CAPITOLUL 5. MODALITATEA DE STOCARE A DATELOR 30
5.1. Concepte necesare realizrii bazei de date 30
5.2. Crearea bazei de date folosind Migrations 31
5.3. Tipuri de utlizatori 33
5.3.1. Administrator 33
5.3.2. Student 34
CAPITOLUL 6. TESTARE 35
6.1. Unit Testing 35
6.2. Domain Testing 35
6.3. Destructive Testing 36
6.4. System Testing 36
CAPITOLUL 7. CONCLUZII 37
7.1. Concluzii 37
7.2. Posibiliti de dezvoltare 37
BIBLIOGRAFIE 38
ANEXE 40
GENERALITI
Aceast aplicaie i are rdcinile n nevoia automatizrii unui job relativ simplu,
dar ce necesit o perioad mai ndelungat de procesare, acela de repartizare a studenilor
n cmine. Nevoia de a nlocui acest proces manual cu unul automatizat am simit-o la
rndul meu n perioadele de cazare, cnd lipsa de organizare i timpul de ateptare pn la
finalizarea documentelor cretea exponenial starea de tensiune.
Prezenta lucrare prezint o implementare a acestui job, prin care sper c se vor
elimin timpul de ateptare, erorile umane posibile, eventualele deplasri nejustificate i
cel mai important, stresul.
Lucrarea este mprit n 7 capitole, fiecare dintre acestea fiind mprite n mai
multe subcapitole cu subtitluri descriptive. Am inclus mai jos cte o descriere succint a
fiecrui capitol prezent n lucrarea de licen.
Capitolul 1: Introducere prezint date generale despre lucrare, precum i
prezentarea pe scurt a aplicaiei.
Capitolul 2: Tehnologii conine enumerarea i descrierea fiecrei tehnologii
utilizate n cadrul dezvoltrii proiectului, cum ar fi HTML, SCSS, CoffeeScript folosite
pentru Front-End, PHP orientat pe obiecte folosit pentru Back-End. Acest capitol mai
cuprinde noiuni despre tool-urile folosite n procesul de dezvoltare al aplicaiei, dar i
concepte de baze de date relaionale, de tip SQL.
Capitolul 3: Concepte Teoretice are menirea de a prezenta conceptele teoretice
fr de care att aplicaia ct i lucrarea de licen nu ar fi putut fi finalizate.
Capitolul 4: Specificaiile aplicaiei prezint caracteristicile generale, logica,
evoluia, dar i implementarea aplicaiei ajutat de numeroase linii de cod ce reprezint
componentele de baz ale acesteia.
Capitolul 5: Modalitatea de stocare a datelor face referire la extensia folosit
pentru stocarea i manipularea datelor. Pentru o nelegere mai bun a acestora, n acest
capitol exist i diagrame UML de clase.
Capitolul 6: Testare cuprinde rezultatele obinute la finalul dezvoltrii aplicaiei.
Testarea joac un rol important n realizarea i evaluarea calitii unui produs software.
Pe de o parte, se mbuntete calitatea produselor n timp ce repetm un ciclu de
depanare-remediere n timpul dezvoltrii. Pe de alt parte, evalum ct de bun este

4
sistemul nostru atunci cnd efectum teste la nivel de sistem nainte de a lansa un
produs.[1]
Capitolul 7: Concluzii face referire la opinia mea personal despre aceast
aplicaie, dar i posibilitile ulterioare de dezvolatare ale acesteia.

5
CAPITOLUL 1.
INTRODUCERE

1.1. Motivaie
Aa cum am specificat mai sus, aceast aplicaie are ca scop principal
mbuntirea procesului de cazare al studenilor.
Deoarece trim n era tehnologiei, n care, pe zi ce trece aplicaiile devin din ce n
ce mai utile pentru om, se simte nevoia eliminrii efortului uman din domenii diferite, un
exemplu fiind aceast aplicaie. Direcia ctre o aplicaie web s-a datorat faptului c peste
90% din studeni au acces la internet de mare vitez chiar de pe telefonul mobil.
Momentul n care m-am decis c trebuie dezvoltat o asemenea aplicaie a fost
acela n care am aplicat la rndul meu pentru un loc n cmin, experien pe care nu mai
doresc s o retriesc att eu ct i ali studeni.

1.2. Tema proiectului


Procesul actual de cazare este unul minuios ce implic din partea studenilor
cutarea informaiilor despre cmine n mai multe locuri, completarea diferitelor
documente, precum i o risip de timp. Persoanele care au ca atribuie realizarea
repartizrii locurilor n cmine sunt supuse unui efort de concentrare, proces care, de cele
mai multe ori necesit o perioad mai lung de timp pentru a fi finalizat cu succes.
Datorit experienei avute pe parcursul acestei proceduri, am decis c aceast
aplicaie poate fi un tool care s uureze att munca persoanelor responsabile cu realizarea
listelor de cazare n cmine, ct i s ofere o experien mai plcut studenilor, n fiecare
an universitar.

6
CAPITOLUL 2.
TEHNOLOGII

2.1. PHP
Exist multe tehnologii disponibile pentru crearea de aplicaii web dinamice.
Cele mai obinuite sunt ASP.NET (Actice Server Pages), JSP (Java Server Pages,
ColdFusion, Ruby on Rails[2] i nu n ultimul rnd PHP.
Iniial, PHP venea de la Personal Home Page aa cum a fost creat in 1994 de
ctre Rasmus Lerdof ce folosea limbajul pentru a urmrii numrul de vizitatori de pe
CV-ul su online. Pe msur ce utilitatea i capacitile sale au crescut (i pe msur ce
au nceput s fie utilizat n situaii mai profesionale) a ajuns s nsemne PHP: Hypertext
Preprocessor.[2]
PHP poate fi ncorporat n HTML, ceea ce nseamn c poi s iei o pagin
HTML standard, s arunci acolo puin PHP i o s ai un rezultat dinamic. Acest atribut
face limbajul foarte accesibil pentru oricine a lucrat puin cu HTML.[2]
De asemenea PHP este un limbaj de scripting nu unul compilat. Scripturile PHP
se execut numai dup apariia unui eveniment de exemplu, atunci cnd un utilizator
trimite un formular sau merge la o adres URL (Uniform Resource Locator). PHP este o
tehnologie de tip server-side cross-platform, ambele descrieri fiind importante. Server-
side se refer la faptul c tot ceea ce face PHP se execut pe server. Este necesar o
aplicaie pentru server web, cum ar fi Apache sau Microsoft IIS (Internet Information
Services), iar toate scripturile acestuia trebuie s fie accesate printr-o adres URL. Cross-
platform nseamn ca PHP ruleaz pe majoritatea sistemelor de operare, inclusiv
Windows, Unix (i mai multe variante) i Macintosh. Mai important de att este faptul c
scripturile scrise pe un server vor funciona n mod normal pe un altul cu foarte puine sau
deloc modificri.[3]

Modelul Client-Server

7
Am folosit PHP deoarece ofer performane excelente, o strns integrare cu
aproape orice tip de baze de date, stabilitate, portabilitate i un numr extrem de mare de
extensii. Pe de alt parte, fiind un limbaj open-source, acesta nu cost nimic i se pot
finaliza aplicaii complexe folosindu-l (Yahoo, Facebook).

2.2. MySQL
MySQL este cea mai popular baz de date open-source din lume. De fapt, astzi
MySQL este un concurent viabil pentru firmele cu renume, cum ar fi Oracle i Microsoft
SQL Server (i, ironic, MySQL este deinut de Oracle). Ca i PHP, MySQL ofer
performane excelente, portabilitate i fiabilitate, cu o curb moderat de nvare.[2]
MySQL este cunoscut pentru gestiunea bazelor de date ce conin circa 60.000 de
tabele cu mai mult de 5 miliarde de rnduri. MySQL poate lucra cu tabele de pn la 8
milioane de terabytes pe unele sisteme de operare. MySQL este folosit de NASA i de
Biroul de Recensmnt al Statelor Unite, printre multe altele.[3]

Modelul Client-Server ce folosete o baz de


date de tip MySql

2.3. CoffeeScript
Pe 13 decembrie 2009, Jeremy Ashkenas a fcut primul commit pe Git de
CoffeeScript cu comentariul: "comiterea iniial a limbajului misterului". Compilatorul a
fost scris n Ruby. La 24 decembrie, a fcut prima lansare de tag-uri i documentaie,
0.1.0. Pe 21 februarie 2010, el a updatat la versiunea 0.5, n care a nlocuit compilatorul
Ruby cu o versiune auto-gazd n CoffeeScript pur. n acest timp, proiectul a atras mai
muli contribuitori pe GitHub i a primit peste 300 de accesri pe zi. Pe 24 decembrie
2010, Ashkenas a anunat lansarea versiunii 1.0.0 stabil pentru Hacker News, site-ul
unde proiectul a fost anunat pentru prima dat.[4]

8
CoffeeScript este un limbaj care se compileaz n JavaScript i ncearc s
expun prile bune ale JavaScript-ului ntr-un mod simplu.[5]
Regula de aur a CoffeeScript-ului este: "Its just JavaScript". Codul se
compileaz unu la unu n JS echivalent i nu exist interpretare la timpul de execuie.
Putei utiliza orice bibliotec JavaScript existent fr probleme de la CoffeeScript (i
invers). Ieirea compilat este uor de citit i tinde s ruleze la fel de repede sau mai
repede dect JavaScript echivalent scris de mn.[5]

2.4. jQuery
jQuery este o platform de dezvoltare JavaScript, conceput pentru a uura i
mbunti procese precum traversarea arborelui DOM n HTML, managementul
inter-browser al evenimentelor, animaii i cereri tip AJAX. jQuery a fost gndit s fie ct
mai mic posibil, disponibil n toate versiunile de browsere importante existente, i s
respecte filosofia "Unobtrusive JavaScript". Biblioteca a fost lansat in 2006 de ctre John
Resig.[7]
Acesta a luat privirile dezvoltatorilor web, ctignd rapid sprijinul major al
site-urilor precum MSNBC i proiecte bine-cunoscute, inclusiv open-source SourceForge,
Trac i Drupal.[6]
jQuery se poate folosi pentru a rezolva urmtoarele probleme specifice
programrii web:
selecii de elemente n arborele DOM folosind propriul motor de selecii
open-source Sizzle, un proiect nscut din jQuery
parcurgere i modificarea arborelui DOM (incluznd suport pentru
selectori CSS 3 i XPath simpli)
nregistrarea i modificarea evenimentelor din browser
manipularea elementelor CSS
efecte i animaii
cereri tip AJAX
extensii [7]

9
2.5.AJAX
Ajax (sau AJAX), prescurtare pentru Asynchronous JavaScript and XML, este o
tehnic de programare pentru crearea de aplicaii web interactive. Intenia este s fac
paginile web s devin mai rapide i deci mai acceptate, prin schimbul n fundal al unor
cantiti mici de date cu serverul, astfel nct s nu fie nevoie ca pagina s fie rencrcat
la fiecare aciune a utilizatorului. Aceasta are ca scop creterea interactivitii, vitezei i
uurinei n utilizare a aplicaiilor web.[8]
Ajax nu este o tehnologie n sine. Termenul este folosit pentru definirea
aplicaiilor web ce folosesc un ansamblu de tehnologii:
HTML sau XHTML pentru structura semantic a informaiilor;
CSS pentru prezentarea informaiilor;
Javascript pentru interactivitate, pentru procesarea informaiilor prezentate;
Obiectul XMLHttpRequest pentru schimbul i manipularea informaiilor
ntr-o manier asincron cu server-ul web;
XML este folosit de obicei pentru transferarea datelor ntre server i client,
dei orice format funcioneaz, inclusiv HTML preformatat, text simplu
etc.[8]

2.6.HTML

HTML este o form de marcare orientat ctre prezentarea documentelor text pe


o singur pagin, utiliznd un software de redare specializat, numit agent utilizator
HTML, cel mai bun exemplu de astfel de software fiind browserul web. HTML
furnizeaz mijloacele prin care coninutul unui document poate fi adnotat cu diverse tipuri
de metadate i indicaii de redare. Indicaiile de redare pot varia de la decoraiuni minore
ale textului, cum ar fi specificarea faptului c un anumit cuvnt trebuie subliniat sau c o
imagine trebuie introdus, pn la scripturi sofisticate, hri de imagini i formulare.
Metadatele pot include informaii despre titlul i autorul documentului, informaii
structurale despre cum este mprit documentul n diferite segmente, paragrafe, liste,
titluri etc. i informaii cruciale care permit ca documentul s poat fi legat de alte
documente pentru a forma astfel hiperlink-uri (sau web-ul).[9]
HTML se poate genera direct utiliznd tehnologii de codare din partea serverului
cum ar fi PHP, JSP sau ASP.[9]
10
HTML este de asemenea utilizat n e-mail. Majoritatea aplicaiilor de e-mail
folosesc un editor HTML ncorporat pentru compunerea e-mail-urilor i un motor de
prezentare a e-mail-urilor de acest tip.[9]

2.7.CSS
Cascading Style Sheets (CSS) reprezint o modalitate puternic de a afecta
prezentarea unui document sau a unei colecii de documente. Evident, CSS este practic
inutil fr un document, deoarece nu ar avea niciun coninut de prezentat. Desigur,
definiia "documentului" este extrem de larg. De exemplu, Mozilla i browserele asociate
utilizeaz CSS pentru a afecta prezentarea browserului chrome n sine. Cu toate acestea,
fr coninutul butoanelor cromate, intrri de adrese, casete de dialog, ferestre i aa mai
departe - nu ar fi nevoie de CSS (sau de alte informaii de prezentare).[10]

2.8.Bootstrap

Bootstrap este un produs open-source care a evoluat de la a fi un proiect bazat n


ntregime pe CSS, n a include o serie de plugin-uri i iconie JavaScript care merg mn
n mn cu formulare i butoane. La baza sa, permite un design web responsive i are o
gril robust de 12 coloane, de 940 de pixeli.[12]
Una dintre prile cele mai frustrante de a ncepe un proiect de la zero este de a
reinventa baza HTML, CSS i JavaScript pentru fiecare dintre acestea. Este mult mai
logic s reutilizai acelai cod de baz i apoi s l construii pe baza acestuia. Unii
dezvoltatori pot prefera s i scrie propriul framework, iar n unele cazuri acest lucru
poate avea sens. Cu toate acestea, majoritatea proiectelor, folosesc un framework existent.
nafar de componentele pe care Bootstrap le furnizeaz out-of-the-box, exist sute de alte
componente ale unor tere pri pe care le putei integra.[11]

2.9.Laravel
Laravel este un framework rapid de dezvoltare al aplicaiilor. Aceasta nseamn
c se concentreaz pe o curb superficial (uoar) de nvare i pe minimizarea pailor
ntre pornirea unei noi aplicaii i publicarea ei. Toate cele mai obinuite sarcini n
construirea aplicaiilor web,cum ar fi interaciunile cu baza de date, autentificarea, cozile
de e-mail, cacheing-ul, sunt simplificate de componentele pe care Laravel le ofer.
11
Componentele lui Laravel nu sunt ns perfecte pe cont propriu; ele furnizeaz un API
consistent i structuri previzibile pe ntregul framework.[13]
Laravel ofer un ntreg ecosistem de instrumente pentru construirea i lansarea de
aplicaii. Exist Homestead i Valet pentru dezvoltare local, Forge pentru gestionarea
serverului i Envoyer pentru implementare avansat. Exist o suit de pachete
suplimentare: Cashier pentru pli i abonamente, Echo pentru WebSockets, Scout pentru
cutare, Passport pentru autentificarea API, Socialite pentru conectare social i Spark
pentru bootstrap. Laravel ncearc s elimine munca repetitiv ale dezvoltatorilor, astfel
nct s poat face ceva unic.[13]

12
CAPITOLUL 3.
CONCEPTE TEORETICE

3.1.Concepte OOP

Dei PHP nu este nc la fel de puternic pe partea de OOP precum alte limbaje de
programare, acesta deine toate conceptele teoretice necesare pentru dezvoltarea unei
aplicaii object-orientated.
Toate limbajele de programare se bazeaz pe aciuni cu date: un utilizator
introduce datele ntr-un formular HTML; codul PHP l valideaz, l trimite prin e-mail i
l stocheaz ntr-o baz de date; i asa mai departe. Acestea sunt doar verbe (aciuni) i
substantive (date). n programarea procedural, accentul se pune pe verbe: face asta, apoi
asta, apoi asta. n OOP, accentul se pune pe substantive: cu ce tipuri de lucruri va
funciona aplicaia? n ambele abordri, trebuie s identificai att substantivele, ct i
verbele necesare; diferena este n modul de proiectare a aplicaiei.[14]
Unul dintre principiile OOP este modularitatea: mprirea aplicaiilor n
subprile specifice. Site-urile Web fac multe, multe lucruri: interacioneaz cu bazele de
date, gestioneaz formularele, trimit e-mailuri, genereaz HTML etc. Fiecare dintre aceste
lucruri poate fi un modul, mai specific o clas. Prin separarea elementelor care nu au
legtur (dei interacioneaz), putei dezvolta cod n mod independent, putei face
ntreinerea i actualizrile mai puin dezordonate i putei simplifica depanarea.[14]
Un alt concept de baz este abstractizarea: clasele ar trebui s fie definite n linii
mari. De exemplu, n loc s proiectezi o clas pentru a interaciona cu o baz de date
MySQL, ar trebui s faci una care s interacioneze cu o baz de date nespecific. De
acolo, folosind motenirea i suprascrierea, ai defini o clas mai special pentru MySQL.
Aceast clas ar arta i ar aciona ca o clas general de baze de date, dar unele
funcionaliti ar fi personalizate.[14]
Un alt principiu OOP este ncapsularea: separarea i ascunderea modului n care
se realizeaz ceva. O clas bine conceput poate face tot ce ai nevoie fr s tii cum se
face. Cuplat cu ncapsularea este vizibilitatea, care dicteaz modul n care sunt disponibile
componente ale clasei.[14]

13
3.2.Concepte MVC
MVC (Model-View-Controller) este un model de proiectare software construit n
jurul interconectrii a trei tipuri principale de componente, ntr-un limbaj de programare,
cum ar fi PHP, de multe ori cu un accent puternic pe paradigmele software-ului de
programare orientat pe obiecte (OOP). Cele trei tipuri de componente sunt: modele,
vizualizri i controale.[15]
Modelele se bazeaz pe elemente din lumea real, cum ar fi o persoan, un cont
bancar sau un produs. Acestea sunt, de obicei, permanente i vor fi stocate n afara
aplicaiei, adesea ntr-o baz de date. Un model este mai mult dect date; el aplic toate
regulile de afaceri care se aplic acestor date.[16]
Views - Reprezentarea vizual a unui model, dat fiind un anumit context. Este,
de obicei, marcajul rezultat pe care framework-ul l red n browser, cum ar fi HTML.
View-ul este responsabil pentru generarea unei interfee de utilizator, bazat n mod
normal pe datele din model. Dei un view poate prezenta utilizatorului diferite modaliti
de introducere a datelor, view-ul nu se ocup niciodat de datele primite.[16]
Controller - Coordonatorul care asigur legtura dintre view i model.
Controller-ul este responsabil pentru procesarea intrrilor, care acioneaz asupra
modelului i pentru a decide ce aciuni ar trebui s fie efectuate, cum ar fi redarea unei
vizualizri sau redirecionarea ctre o alt pagin.[16]

Componentele MVC ale unei aplicaii Laravel

14
3.3.Expresii regulate
O expresie regulat, regex sau regexp (numit uneori expresie raional) este, n
informatica teoretic i n teoria limbajelor formale, un ir de caractere care definesc un
ablon de cutare. De obicei, acest ablon este apoi utilizat de ctre algoritmii de cutare
pe iruri pentru operaiuni de cutare sau cutare i nlocuire operaiuni pe iruri de
caractere.
Conceptul a aprut n anii 1950, cnd matematicianul american Stephen Cole
Kleene a formalizat descrierea unui limbaj regulat. Conceptul a intrat n uz comun
mpreun cu utilitarele de prelucrare a textului din Unix. Astzi, exist diferite sintaxe
pentru scrierea expresiilor regulate, una fiind standardul POSIX i alta, utilizat pe scar
larg, fiind sintaxa Perl.
Expresiile regulate sunt folosite n motoarele de cutare, de dialogurile de cutare
i nlocuire ale procesoarelor i editoarelor de text, n utilitare de prelucrare a textului,
cum ar fi n analiza lexical. Multe limbaje de programare furnizeaz capabiliti regex fie
built-in, fie prin intermediul unor biblioteci(d).[17]
n cadrul proiectului meu, expresiile regulate sunt folosite n Client-Side pentru a
face verificri ale input-urilor, cum ar fi: validarea unui e-mail, a unui numr de telefon,
pn a fi trimise la validarea Server-Side.

3.4.Structuri de date
n orice limbaj orientat pe obiecte exist biblioteci pentru operaiile cu structuri de
date. n PHP, acestea sunt reprezentate de: Doubly Linked Lists, Heaps, Arrays, Maps. n
acest limbaj de programare cea mai folosit structur de date este Array-ul de tip
asociativ. Acesta este folosit cu scopul principal de a extrage date dintr-o baz de date
folosit n cadrul aplicaiei.

3.5.Protocolul HTTP
Hypertext Transfer Protocol (HTTP) este metoda cea mai des utilizat pentru
accesarea informaiilor n Internet care sunt pstrate pe servere World Wide Web
(WWW). Protocolul HTTP este un protocol de tip text, fiind protocolul "implicit" al
WWW. Adic, dac un URL nu conine partea de protocol, aceasta se consider ca fiind
http. HTTP presupune c pe calculatorul destinaie ruleaz un program care nelege
15
protocolul. Fiierul trimis la destinaie poate fi un document HTML (abreviere de la
HyperText Markup Language), un fiier grafic, de sunet, animaie sau video, de asemenea
un program executabil pe server-ul respectiv sau i un editor de text. Dup clasificarea
dup modelul de referin OSI, protocolul HTTP este un protocol de nivel aplicaie.[18]
Metodele disponibile n acest protocol sunt :
GET: este cea mai folosit metod, fiind utilizat atunci cnd serverului i
se cere o resurs.
HEAD: se comport exact ca metoda GET, dar serverul returneaz doar
antetul resursei, ceea ce permite clientului s inspecteze antetul resursei,
fr a fi nevoit s obin i corpul resursei.
PUT: metoda este folosit pentru a depune documente pe server, fiind
inversul metodei GET.
POST: a fost proiectat pentru a trimite date de intrare ctre server.
DELETE: este opusul metodei PUT.
TRACE: este o metod folosit de obicei pentru diagnosticare, putnd da
mai multe informaii despre traseul urmat de legtura HTTP, fiecare server
proxy adugndu-i semntura n antetul Via.
OPTIONS: este folosit pentru identificarea capacitilor serverului Web,
nainte de a face o cerere.
CONNECT: este o metod folosit n general de serverele
intermediare.[18]

3.6.UML: Use Case Diagrams


Pentru a modela un sistem, aspectul cel mai important este de a capta
comportamentul dinamic. Comportamentul dinamic nseamn comportamentul sistemului
atunci cnd acesta funcioneaz / nu funcioneaz. n UML, exist cinci diagrame
disponibile pentru modelarea naturii dinamice, iar diagrama cazurilor este una dintre
ele.[19]
Putem spune c aceste cazuri de utilizare nu sunt altceva dect funcionalitile
sistemului, scrise ntr-o manier organizat. Cel mai relevant rol n aceste diagrame l au
actorii. Actorii pot fi definii ca ceva care interacioneaz cu sistemul. Actorii pot fi
utilizatori umani, unele aplicaii interne sau pot fi unele aplicaii externe.
16
CAPITOLUL 4.
SPECIFICAIILE APLICAIEI

4.1.Prezentarea general a aplicaiei


Aa cum am prezentat n subcapitolul 1.1, procedeul de cazare n cmin supune
ambele pri implicate, studenii i respectiv persoanele care au ca atribuie realizarea
repartizrii locurilor, la un job ce poate fi costisitor att din punct de vedere al timpului
ct i al stresului generat.
Cu aceast problem se confrunt orice instituie de nvmnt, iar lipsa
soft-urilor dedicate acestui proces a dat natere aplicaiei Dorminator.
Pe de o parte, proiectul ajut persoanele oficiale prin reducerea pailor necesari
finalizrii activitii de cazare. Printr-o interfa curat, acestea pot ncrca fiiere de tip
XLSX att cu studeni, ct i cu informaii despre camerele din cmine disponibile pentru
fiecare instituie n parte. Doar prin aceste metode complexitatea n timp este diminuat
exponenial.
Pe de alt parte, aplicaia ofer o alternativ mai uoar pentru studenii
facultilor, de a se caza la un cmin, doar prin accesarea unui site web de pe orice device,
astfel evitndu-se cozile aparent interminabile de la ghieele universitilor.

4.2.Implementare

Mockup aplicaie Dorminator Interfaare

Primul cadru cu care utilizatorul este ntmpinat este cel de Login. Acesta are ca
scop autentificarea unui utilizator ce deine deja un cont n aplcaie.La prima rulare a
17
acesteia se creeaz un cont de tip Super Admin. n cadrul aceleiai interfee
(Anexa 4.2 - 1) exist i posibilitatea de a-i reseta parola, n cazul utilizatorilor care i-au
uitat credenialele. Principalela funcie care se ocup de acest Login este dat mai jos:
public function login(Request $request)
{
try{
$username = $request['username'];
$password = $request['password'];
$remember = $request['remember'];

$user = User::where('username', '=', $username)->first();

if ($user === null) {


return response()->json([
'success' => false,
'message' => 'Aceast utilizator nu exist.',
'field' => 'username',
]);
}elseif(Auth::attempt(['username' => $username, 'password' => $password], $remember)){
$user = Auth::user();
if($user->has_temp_password){
return response()->json([
'success' => false,
'url' => 'change-password',
]);
}
return response()->json([
'success' => true,
]);
}else{
return response()->json([
'success' => false,
'message' => 'Parola este greit',
'field' => 'password',
]);
}

}catch(\Exception $e){
return response()->json([
'success' => false,
'message' => 'A intervenit o problem! V rugm s ne contactai telefonic.',
]);
}
}

Pe aceast pagin exist 2 cmpuri ce necesit completare: username, password. O


parte din validare se gsete i pe Client-Side. Codul ce se execut atunci cnd un
utilizator ncearc s se logheze este:

18
$ ->
#On enter login
$(document).keypress (e) ->
if e.which == 13
$('#login').click()
return

$('#login').click (e) ->


$('#username').removeClass 'invalid'
$('#password').removeClass 'invalid'
username = $('#username').val()
token = $('[name="_token"]').val()
remember = $('#remember').is(':checked')

if username.trim() == ""
$('#username').addClass 'invalid'
toastr.error("Unul sau mai multe cmpuri sunt goale sau conin erori!")
return
password = $('#password').val()
if password.trim() == ""
$('#password').addClass 'invalid'
toastr.error("Unul sau mai multe cmpuri sunt goale sau conin erori!")
return
$.post '/login', {_token: token, username: username, password: password, remember:
remember}, (json) ->
if !json.success
if typeof json.url != 'undefined'
window.location.href = json.url
return
if typeof json.field != 'undefined'
$('#' + json.field).addClass 'invalid'
toastr.error(json.message)
return
else
window.location.href = "/profile"
return
return

Dac utilizatorul are o parol temporar atunci aplicaia l va redireciona ctre o


pagin unde este nevoit s i modifice parola din motive de securitate. (Anexa 4.2 2).
Funcia ce se ocup de acest lucru este:
public function changePasswordTemplate(Request $request){
if ($request->isMethod('get')){
$user = Auth::user();
return view('change-password', ['user' => $user,]);
}elseif ($request->isMethod('post')){
$user = Auth::user();
$user->password = Hash::make($request->password);
$user->save();
return response()->json([
19
'success' => true,
'url' => '/profile',
]);
}else{
abort(500, "Nu avei dreptul pentru a accesa aceast pagin");
}
}
Dup cum putei observa parola este criptat cu ajutorul algoritmului Hash de
criptare al parolelor, implementat n Laravel pentru a da bti de cap persoanelor ru
intenionate. Dup acest pas user-ul este redirecionat ctre pagina de profil unde poate s
i modifice datele de contact (Anexa 4.2 - 3).
$ ->
$('#change-user-profile').click (e) ->
e.preventDefault()
$('#error-box-profile').addClass 'hidden'
email = $('#email').val()
token = $('[name="_token"]').val()
name = $('#name').val()
phone = $('#phone').val()
sex = $('input[name=gender]:checked').attr('id')

formHasErrors = false
emailRegex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/
if !emailRegex.test(email)
console.log 'eorare email'
$('#email').addClass('invalid')
formHasErrors = true
phoneRegex = /^[0-9]+$/
if !phoneRegex.test(phone)
$('#phone').addClass('invalid')
formHasErrors = true
if formHasErrors
toastr.error("Unul sau mai multe cmpuri sunt goale sau conin erori!")
return
$.post '/change-user-profile', {
_token: token,
email: email,
sex: sex,
phone: phone
} , (json) ->
if !json.success
toastr.error("Unul sau mai multe cmpuri sunt goale sau conin erori!")
return
else
location.reload()
return
return

Dup validarea Client-Side, datele de contact se trimit la server, unde se mai


execut o ultim validare i se salveaz modificrile n baza de date.
20
public function updateProfile(Request $request)
{
try{
$validator = Validator::make(['email' => $request['email'], 'phone' => $request['phone']],
['email' => 'required|email|max:255|unique:users', 'phone' => 'required']);

if (!$validator->fails()) {
$user = Auth::user();
$user->email = $request['email'];
$user->contact->phone = $request['phone'];
$user->update();
$user->contact->update();
}
}catch(\Exception $e){
return response()->json([
'success' => false,
'message' => 'A intervenit o problem! V rugm s ne contactai telefonic.',
]);
}
return response()->json([
'success' => true,
]);
}

Deoarece aplicaia a fost implementat s ajute mai mult personalul administrativ


al instituiilor, voi prezenta n continuare aplicaia prin tipul de utilizator admin. Deoarece
este nevoie de mai multe persoane s administreze aplicaia, un admin poate s adauge ali
admini (Anexa 4.2 4). Cmpul de e-mailuri este obligatoriu, iar dup ce este trimis la
server, se creeaz un utilizator de tip admin cu o parol temporar i se trimite un e-mail
de confirmare pentru fiecare adres valid.
public function addAdmins(Request $request)
{
try{
$request->emails = preg_split('`\s`', $request->emails);
foreach ($request->emails as $email) {
$result = self::createAdmin($email);
if($result['success']){
Mail::send('email-templates.admin-confirmation', ['user' => $result['user'],
'password' => $result['password']], function ($m) use ($email) {
$m->from('i.tconsult99@gmail.com', 'Dorminator');
$m->to($email)->subject('Dorminator are nevoie de atenia ta!');
});
}
}

return response()->json([
'success' => true,
21
'message' => 'S-a trimis invitaie de nregistrare catre toate adresele de email',
]);

}catch(\Exception $e) {
return response()->json([
'success' => false,
'message' => 'A intervenit o problem! V rugm s ne contactai telefonic.',
]);
}
}

Urmtorul pas este adugarea de instituii. Aici sunt prezente 3 cmpuri dintre care doar 2
sunt obligatorii (Nume instituie, Cod instituie) (Anexa 4.2 5). Aceste cmpuri au fost
gndite n acest mod pentru a facilita mprirea pe ani (I, II, III, IV), specializri (INFO,
MATE, etc.), grade (Licen, Master, Doctorat) fiind necesar doar un cod unic pentru
fiecare.
public function addInstitution(Request $request)
{
if ($request->isMethod('get')) {
$user = Auth::user();
$institutions = Institution::orderBy('created_at', 'desc')->paginate(20);
return view('institutions/add-institution', ['user' => $user, 'institutions' =>
$institutions]);
} elseif ($request->isMethod('post')) {
$institution = Institution::where('code', '=', $request->code)->first();
if (!is_null($institution)) {
return response()->json([
'success' => false,
'message' => 'Aceast instituie exist deja',
]);
}

$institution = new Institution();


$institution->name = $request->name;
$institution->code = $request->code;
$institution->description = $request->description;

$institution->save();
return response()->json([
'success' => true,
'message' => 'A fost introdus instituia ' . $institution->name,
]);
}
}

Pentru a aduga un student sau a importa o list cu studeni este necesar s existe
n aplicaie instituiile de care aparin (Anexa 4.2 6)(Anexa 4.2 7). Singurele cmpuri

22
obligatorii din acest formular sunt Nume student, Not concurs, Cod instituie. Codul
pentru a importa studeni se regsete mai jos:
public function uploadStudentsFile(Request $request)
{
$file = $request->file('studentTemplate');
$extension = $request->file('studentTemplate')->getClientOriginalExtension();
$name = 'Students'. time().'.'.$extension;
Storage::disk('files')->put($name, File::get($file));
$path = public_path() . '/files/'.$name;
Excel::load($path, function($reader) {
$reader->each(function($row) {
// Loop through all rows
$result = self::createStudent($row);
if($result['success']){
$this->message .= "\nA fost adugat ". $row->nume_prenume;
}else{
$this->message .= "\n". $result['message'];
}

});

});
$current_user = Auth::user();
MessageController::sendMessageFromAdmin($current_user->id, $this->message, 'Adugare
studeni');
return redirect('/add-students');
}

public static function createStudent($student)


{

$institution = Institution::where('code', '=', $student->cod_falcultate)->first();

if(is_null($institution)){
return ['success' => false, 'message' => 'Nu exist instituie cu codul '. $student-
>cod_falcultate];
}

$user = new User();


$base = str_replace(' ','.',strtolower($student->nume_prenume));
$user->username = $base.substr(strval(time()), -4);
$user->password = Hash::make($base.floatval($student->media_finala));
$user->has_temp_password = true;
if (trim($student->email) == ''){
$domain = '';
$domain_names = explode(' ',$institution->name);
foreach ($domain_names as $dom){
$domain .= strtolower($dom);
}
$user->email = $user->username.'@'.$domain.'.com';
$user->has_temp_email = true;

23
}else{
$user->email = $student->email;
$user->has_tmp_email = false;
}
$user->is_admin = false;
$user->is_super_admin = false;
$user->save();

$contact = new Contact();


$contact->name = $student->nume_prenume;
$contact->grade = floatval($student->media_finala);
$contact->cnp = $student->cnp;
$contact->phone = $student->telefon;
$contact->sex = $student->sex;
$contact->institution_code = $institution->code;
$user->contact()->save($contact);

return ['success' => true];

Dup finalizarea adugrii studenilor prin oricare dintre metode, personalul


autorizat poate s genereze un document printabil pentru a nmna studenilor cte un
sticker cu user-ul i parola generat automat (ce trebuie schimbat la primul login).
Admin-ul are la dispoziie o interfa (Anexa 4.2 8) pentru a aduga cmine i
alta (Anexa 4.2 9) pentru a ncrca un fiier de tip XLSX cu informaii despre camerele
aferente fiecrui cmin.

public $message = '';

public function getDormsTemplate(Request $request)


{
if ($request->isMethod('get')) {
$user = Auth::user();
$dorms = Dorm::orderBy('created_at', 'desc')->paginate(20);
$can_insert = true;
if (is_null(Dorm::first())) {
$can_insert = false;
}
return view('dorms/dorms-template', ['user' => $user, 'dorms' => $dorms, 'can_insert'
=> $can_insert]);
} elseif ($request->isMethod('post')) {
$dorm = Dorm::where('code', '=', $request->code)->first();
if (!is_null($dorm)) {
return response()->json([
'success' => false,
'message' => 'Aceast cmin exist deja',
]);
}

$dorm = new Dorm();

24
$dorm->name = $request->name;
$dorm->code = $request->code;
$dorm->description = $request->description;

$dorm->save();
return response()->json([
'success' => true,
'message' => 'A fost introdus cminul ' . $dorm->name,
]);
}
}

public function uploadRoomsFile(Request $request)


{
$file = $request->file('roomTemplate');
$extension = $request->file('roomTemplate')->getClientOriginalExtension();
$name = 'Rooms'. time().'.'.$extension;
Storage::disk('files')->put($name, File::get($file));
$path = public_path() . '/files/'.$name;
Excel::load($path, function($reader) {
$reader->each(function($row) {
$result = self::createRoom($row);
if ($result['success']){
$this->message .= "\nAu fost adugate camerele de la ". $row->camera_de_la . "
pan la ". $row->camera_pana_la . " a cminului cu codul ". $row->cod_camin;
}else{
$this->message .= "\n". $result['message'];
}

});

});
$current_user = Auth::user();
MessageController::sendMessageFromAdmin($current_user->id, $this->message, 'Adugare
camere');
return redirect('/dorms');
}

public static function createRoom($room)


{
$dorm = Dorm::where('code', '=', trim($room->cod_camin))->first();
if(is_null($dorm)){
return ['success' => false, 'message' => 'Nu exist cmin cu codul '. $room->cod_camin];
}
$institution = Institution::where('code', '=', $room->cod_facultate)->first();
if(is_null($institution)){
return ['success' => false, 'message' => 'Nu exist instituie cu codul '. $room-
>cod_facultate];
}

$room->camera_de_la = intval($room->camera_de_la);
$room->camera_pana_la = intval($room->camera_pana_la);
for ($i = $room->camera_de_la; $i<=$room->camera_pana_la; $i++){
25
$new_room = new Room();
$new_room->dorm_code = $room->cod_camin;
$new_room->room_number = $i;
$new_room->capacity = $room->capacitate;
$new_room->institution_code = $room->cod_facultate;

$new_room->save();
}
return ['success' => true];
}

Dup aceast etap administratorii apas pe butonul Permite aplicarea pentru a


lsa studenii s aplice pentru diferite camere. La acest pas, studenii i pot selecta
cminul favorit (Anexa 4.2 10).

public function selectDorm(Request $request)


{
$user = Auth::user();
if ($request->isMethod('get')) {
$has_been_accepted = false;
$data = [];
$main_movement = Movement::where('user_id', '=', $user->id)-
>where('has_been_parsed', '=', true)->where('acceptance', '=', true)->first();

if(!is_null($main_movement)){
$has_been_accepted = true;
$data['main_dorm'] = Dorm::where('code','=', $main_movement->dorm_code)->first();
}
$codes = [];
$dorm_codes = DB::table('rooms')->select(DB::raw('distinct dorm_code'))-
>where('institution_code', '=', $user->contact->institution_code)->get()->toArray();
foreach ($dorm_codes as $dorm_code){
$codes[] = $dorm_code->dorm_code;
}
$dorms = Dorm::whereIn('code', $codes)->paginate(20);
$can_apply = false;
$can_apply_dorm_codes = DB::table('rooms')->select(DB::raw('distinct dorm_code'))-
>where('institution_code', '=', $user->contact->institution_code)->whereRaw('occupation <
capacity')->get()->toArray();
if(!is_null($can_apply_dorm_codes) && is_array($can_apply_dorm_codes) &&
count($can_apply_dorm_codes) > 0){
$can_apply = true;
}
$can_apply_codes = [];
foreach ($can_apply_dorm_codes as $dorm_code){
$can_apply_codes[] = $dorm_code->dorm_code;
}
$dorms_can_apply = Dorm::whereIn('code', $can_apply_codes)->get();

$has_applied = false;
$has_applied_quesry = Movement::where('user_id', '=', $user->id)-
>where('has_been_parsed', '=', false)->orderBy('created_at', 'desc')->first();
26
if(!is_null($has_applied_quesry)){
$has_applied = true;
}

$dbstat = Dbstat::orderBy('created_at', 'desc')->first();

$data['db_stat'] = $dbstat;
$data['has_applied'] = $has_applied;
$data['user'] = $user;
$data['has_been_accepted'] = $has_been_accepted;
$data['dorms'] = $dorms;
$data['can_apply'] = $can_apply;
$data['dorms_can_apply'] = $dorms_can_apply;
return view('dorms/select-dorm', $data);
}elseif ($request->isMethod('post')){
$dorm = Dorm::where('code','=', $request->dorm)->first();
if(is_null($dorm)){
return response()->json([
'success' => false,
'message' => 'Nu exist cmin cu acest cod',
]);
}
$movement = new Movement();
$movement->user_id = $user->id;
$movement->institution_code = $user->contact->institution_code;
$movement->dorm_code = $request->dorm;
$movement->acceptance = false;
$movement->has_been_parsed = false;
$movement->sex = $user->contact->sex;
$movement->grade = $user->contact->grade;
$movement->room_id = -1;
$movement->save();
return response()->json([
'success' => true,
]);
}
}

Administratorii pot porni oricnd procesul de alocare al camerelor, iar n timpul


execuiei, studenii nu mai au voie s aplice pentru un cmin. Acest algoritm de alocare
este partea cea mai important a aplicaiei. Regula principal a acestuia este
Diferenierea pe sexe a camerelor de cmin se face prioritar pe baza notei de concurs..
Spre exemplu, dac o camer are toate locurile disponibile, primul canditat pe lista
cminului respectiv cu nota cea mai mare va primi unul dintre locurile libere, urmnd ca
urmtorii stundeni de acelai sex cu primul s aibe prioritate la ocuparea camerei
respective.

27
public static function beginSort()
{
$stat = new Dbstat();
$stat->start = true;
$stat->end = false;
$stat->can_operate = false;
$stat->save();

$institutions = Institution::orderBy('created_at', 'asc')->get();


foreach ($institutions as $institution)
{
$rooms = Room::where('institution_code', '=', $institution->code)-
>whereRaw('occupation < capacity')->cursor();
foreach ($rooms as $room){
if($room->occupation == 0){
$highest_movement = Movement::where('dorm_code', '=', $room->dorm_code)-
>where('institution_code', '=', $institution->code)->where('has_been_parsed', '=', false)-
>orderBy('grade', 'desc')->first();
if(!is_null($highest_movement)){
$movements = Movement::where('dorm_code', '=', $room->dorm_code)-
>where('institution_code', '=', $institution->code)->where('has_been_parsed', '=', false)-
>where('sex', '=', $highest_movement->sex)->orderBy('grade', 'desc')->limit($room-
>capacity)->get();
$occupation = $room->occupation;
foreach ($movements as $movement){
$movement->has_been_parsed = true;
$movement->acceptance = true;
$movement->room_id = $room->id;
$movement->save();
$occupation++;
}
$room->occupation = $occupation;
$room->save();
}
}else{
$highest_movement = Movement::where('room_id', '=', $room->id)-
>where('dorm_code', '=', $room->dorm_code)->where('institution_code', '=', $institution-
>code)->where('has_been_parsed', '=', true)->orderBy('grade', 'desc')->first();
if(!is_null($highest_movement)){
$limit = $room->capacity - $room->occupation;
$movements = Movement::where('dorm_code', '=', $room->dorm_code)-
>where('institution_code', '=', $institution->code)->where('has_been_parsed', '=', false)-
>where('sex', '=', $highest_movement->sex)->orderBy('grade', 'desc')->limit($limit)->get();
if(!is_null($movements)){
foreach ($movements as $movement){
$movement->has_been_parsed = true;
$movement->acceptance = true;
$movement->room_id = $room->id;
$movement->save();
$room->occupation = $room->occupation + 1;
}
$room->save();
}
28
}
}
}
}

$rejected_movements = Movement::where('has_been_parsed', '=', false)-


>orderBy('created_at','desc')->cursor();
if(!is_null($rejected_movements)){
foreach ($rejected_movements as $rejected_movement){
$rejected_movement->has_been_parsed = true;
$rejected_movement->save();
}
}

$stat = new Dbstat();


$stat->start = false;
$stat->end = false;
$stat->can_operate = true;
$stat->save();

Dup finalizarea algoritmului de alocare, fiecare student va putea s vad unul


dintre rezultatele acestuia, fie a intrat la cminul dorit, fie este nevoit s selecteze iari un
cmin i s atepte din nou pornirea algoritmului.
La finalul distribuiilor, cnd toate locurile puse n concurs au fost ocupate,
administratorii pot genera un document printabil cu fiecare student care a reuit s ocupe
un loc n cmin.

29
CAPITOLUL 5.
MODALITATEA DE STOCARE A DATELOR

5.1. Concepte necesare realizrii bazei de date


Primele etape n realizarea unei baze de date relaionale sunt aplicarea celor 3
normalizri pentru a elimina redundana i inconsistena.
1) Prima form de normalizare (1NF)
n prima form de normalizare, dou rnduri de date nu trebuie s conin grupuri
de informaii repetate, adic fiecare set de coloane trebuie s aib o valoare unic, astfel
nct s nu poat fi utilizate mai multe coloane pentru a prelua acelai rnd. Fiecare tabel
ar trebui s fie organizat n rnduri i fiecare rnd ar trebui s aib o cheie primar care o
deosebete ca fiind unic. Cheia Primar este, de obicei, o singur coloan, dar uneori mai
mult de o coloan poate fi combinat pentru a creea o singur cheie primar.[20]
2) A doua form de normalizare (2NF)
Conform celei de-a doua form de normalizare, nu trebuie s existe nici o
dependen parial a oricrei coloane pe cheia primar. Aceasta nseamn c pentru o
tabel care a concatenat cheia primar, fiecare coloan din tabel care nu face parte din
cheia primar trebuie s depind de ntreaga cheie concatenat pentru existena ei. Dac
orice coloan depinde doar de o parte a cheii concatenate, atunci tabelul nu reuete s
treac de a doua form de normalizare.[20]
3) A treia form de normalizare (3NF)
A treia form de normalizare implic faptul c orice atribut non-primar al
tabelului trebuie s depind de cheia primar sau putem spune c nu ar trebui s existe
cazul n care un atribut non-primar este determinat de un alt atribut non-primar. Deci,
aceast dependen funcional tranzitorie ar trebui eliminat i, de asemenea, tabelul
trebuie s fie n a doua form de normalizare.[20]

5.2. Crearea bazei de date folosind Migrations


Migraiile sunt precum controlul versiunii pentru baza de date, permind unei
echipe s modifice i s mprteasc uor schema bazei de date a aplicaiei. Migraiile

30
sunt n mod obinuit asociate cu constructorul schemelor Laravel pentru a creea cu
uurin schema bazei de date a aplicaiei.[21]
Faada Laravel Schema ofer suport bazei de date pentru crearea i manipularea
tabelelor n toate sistemele de baze de date suportate de Laravel.
Pentru a creea o migraie nou se folosete comanda built-in din Artisan
make:migration.
Fiecare nume de fiier de migrare conine o marc de timp care i permite lui
Laravel s determine ordinea migrrilor.[21]
O clas de migrare conine dou metode: up i down. Metoda up este
utilizat pentru a aduga noi baze de date, coloane sau indexuri, n timp ce metoda
down ar trebui s inverseze pur i simplu operaiile efectuate de metoda up.[21]
Pentru a rula toate migraiile se folosete comanda Artisan php artisan migrate.
Pentru a creea o nou tabel de baze de date, utilizai metoda de create din faada
Schema. Metoda de creare accept dou argumente. Primul este numele tabelului, n timp
ce al doilea este o nchidere care primete un obiect Blueprint care poate fi utilizat pentru
a defini noua tabel.[21]
Tipurile de coloane pe care le suport n acest moment Laravel sunt:
$table->bigIncrements (cheie primar)
$table->increments (cheie primar de dimensiuni reduse)
$table->string
$table->boolean
$table->timestamps
$table->float
$table->integer
$table->text[21]
i multe altele pe lng acestea.
Aplicaia Dorminator dispune de urmtoarele fiiere de migrare ce funcioneaz
pe faada Schema din Laravel, fiecare avnd un nume sugestiv: create_users_table,
create_contacts_table, create_messages_table, create_institutions_table,
create_dorms_table, create_rooms_table, create_dbstats_table, create_movements_table.
Schemele de migrare sunt scrise dup exemplele din documentaia oficial a framework-
ului. Codul pentru fiecare dintre acestea se afl mai jos:
31
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username')->unique();
$table->string('email')->unique();
$table->string('password')->password();
$table->boolean('has_temp_password')->default(true);
$table->boolean('has_temp_email')->default(false);
$table->boolean('is_super_admin')->default(false);
$table->boolean('is_admin')->default(false);
$table->timestamps();
$table->rememberToken();
});

Schema::create('contacts', function (Blueprint $table) {


$table->increments('id');
$table->string('name')->nullable();
$table->float('grade',4,2)->nullable();
$table->string('cnp')->nullable();
$table->string('phone')->nullable();
$table->string('sex')->nullable();
$table->string('institution_code')->nullable();
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});

Schema::create('messages', function (Blueprint $table) {


$table->increments('id');
$table->integer('from')->unsigned();
$table->foreign('from')->references('id')->on('users');
$table->integer('to')->unsigned();
$table->foreign('to')->references('id')->on('users');
$table->string('subject');
$table->text('message');
$table->timestamps();
});

Schema::create('institutions', function (Blueprint $table) {


$table->increments('id');
$table->string('name')->nullable();
$table->string('code')->nullable();
$table->string('description')->nullable();
$table->timestamps();
});

Schema::create('dorms', function (Blueprint $table) {


$table->increments('id');
$table->string('name')->nullable();
$table->string('code')->nullable();
$table->string('description')->nullable();
$table->timestamps();
});
32
Schema::create('rooms', function (Blueprint $table) {
$table->increments('id');
$table->string('dorm_code')->nullable();
$table->string('institution_code')->nullable();
$table->integer('room_number')->nullable();
$table->integer('capacity')->nullable();
$table->integer('occupation')->default(0);
$table->timestamps();
});

Schema::create('movements', function (Blueprint $table) {


$table->increments('id');
$table->integer('user_id');
$table->string('institution_code');
$table->string('dorm_code');
$table->boolean('acceptance')->default(false);
$table->boolean('has_been_parsed')->default(false);
$table->string('sex');
$table->float('grade',4,2);
$table->integer('room_id')->nullable();
$table->timestamps();
});

Schema::create('dbstats', function (Blueprint $table) {


$table->increments('id');
$table->boolean('start')->default(false);
$table->boolean('end')->default(false);
$table->boolean('can_operate')->default(true);
$table->timestamps();
});

5.3. Tipuri de utlizatori


n cadrul aplicaiei exist 2 tipuri de utilizatori: Administratori i Studeni

5.3.1 Administrator

Utilizatorii care fac parte din aceast categorie, au dreptul de a insera / modifica /
terge studeni, instituii, cmine, camerele alocate fiecrui cmin i de a porni / opri
procedura de cazare.

33
5.3.2 Student

Drepturile sunt limitate pentru acest tip de utilizatori, acetia avnd acces doar de
vizualizare a informaiilor despre instituii, cmine i camerele acestora. Fa de
administratori studenii mai pot selecta, atunci cnd este cazul, cminul pentru care doresc
s concureze.

34
CAPITOLUL 6.
TESTARE

Aa cum am precizat mai sus, testarea joac un rol important n realizarea i


evaluarea calitii unui produs software, deoarece prin aceste metode mbuntim
calitatea aplicaiei dar totodat i pe noi ca programatori.

6.1. Unit Testing


Laravel este construit cu ajutorul testelor. De fapt, suportul pentru testarea cu
PHPUnit este inclus direct de la instalarea framework-ului i un fiier phpunit.xml este
deja setat pentru aplicaie. Framework-ul, de asemenea, este livrat cu metode convenabile
de ajutor, care v permit s testai n mod expres aplicaiile.[22]
Testele unitate sunt teste care se concentreaz pe o parte foarte mic, izolat din
cod. De fapt, majoritatea testelor unitare se concentreaz probabil pe o singur metod.
Funciile de testare pot testa o poriune mai mare a codului, inclusiv modul n care mai
multe obiecte interacioneaz unul cu cellalt sau chiar o cerere HTTP complet ctre un
punct final JSON.[22]
Scenariile folosite pentru testarea proiectului au fost:
Login
Crearea / Modificarea / tergerea unei instituii
Crearea / Modificarea / tergerea unui cmin
Crearea / Modificarea / tergerea unui student
Crearea / Modificarea / tergerea unei camere de cmin
Modificarea profilului de utilizator
Scenariile de testare menionate mai sus au fost finalizate cu succes n cadrul
ultimei testri.

6.2.Domain Testing
Dou elemente fundamentale ale unui program de calculator sunt cile de intrare
i cile de program. Domeniul de intrare al unui program este setul tuturor datelor
introduse n program. O cale de program este o secven de instruciuni de la nceputul
35
programului pn la un punct de interes din program. De exemplu, sfritul programului
este un punct de interes. Cu alte cuvinte, o cale de program, sau pur i simplu o cale,
corespunde unui anumit flux de control n program.[1]
Scenariile folosite n cadrul Unit testing au fost folosite i aici i toate au trecut cu
brio, afind de fiecare dat rezultatul dorit.

6.3. Destructive Testing


Testarea software distructiv este un tip de testare care ncearc s provoace o
bucat de software s eueze ntr-o manier necontrolat, pentru a-i testa robusteea.[23]
Viteza slab de internet este singurul factor care ar putea pune n pericol buna
funcionare a proiectului. Rspunsul generat de aplicaia Dorminator n acest caz este unul
de eroare Paginii i ia foarte mult s rspund, sau datele ajung foarte trziu la
destinaie.

6.4.System testing
Pentru acest tip de aplicaie am ales browser-ele Google Chrome, Firefox, Safari,
Opera, Midori, Internet Explorer, Midori pentru a face teste de layout, att n versiune
desktop, ct i tablet, phone. Din cauza folsirii framework-ului Bootstrap aplicaia este
responsive, iar plugin-urile de jQuery funcioneaz dup ateptri.

36
CAPITOLUL 7.
CONCLUZII

7.1.Concluzii
n concluzie, aplicaia Dorminator dezvoltat numai pe platforme open-source, are
potenialul de a satisface att nevoile persoanelor responsabile de cazarea, ct i a
studenilor dornici de ocuparea unui loc n cminele facultii.
Atuurile aplicaiei sunt viteza, extensibilitatea, fiabilitatea, toate acestea fiind
ascunse n spatele unei interfee curate i foarte uor de folosit.

7.2.Posibiliti de dezvoltare
Ca eventuale dezvoltri ulterioare, se poate pleca de la construirea unei aplicaii
hibrid mobile folosind framework-ul Ionic i a uneia hibrid desktop folosind
framework-ul Electron, ce vor comunica cu aplicaia de baz prin API-uri ce au ca
rspuns un JSON.
Pe lng acestea se mai pot aduga aplicaii precum un portal de urcat orice fel de
materiale de studiu, documente text, tutoriale video, un centralizator de note i un
generator de orare.
Din punctul meu de vedere, concatenarea tuturor posibilelor dezvoltri ulterioare
ar produce o suit complet de aplicaii necesar pentru o instituie de nvmnt.

37
BIBLIOGRAFIE

1) Kshirasagar Naik, Priyadarshi Tripathy, SOFTWARE TESTING AND


QUALITY ASSURANCE : Wiley, 2008
2) Larry Ullman, PHP and MySQL for Dynamic Web Sites 4th edition: Peachpit
Press, 2012
3) Larry Ullman, PHP and MySQL for Dynamic Web Sites: Visual QuickPro
Guide (5th Edition): Peachpit Press, 2017
4) CoffeeScript
https://en.wikipedia.org/wiki/CoffeeScript
5) CoffeeScript
http://coffeescript.org/
6) Bear Bibeaultt, Yehuda Katz, jQuery in Action: Manning, 2008
7) jQuery
https://ro.wikipedia.org/wiki/JQuery
8) Ajax (programare)
https://ro.wikipedia.org/wiki/Ajax_(programare)
9) HyperText Markup Language
https://ro.wikipedia.org/wiki/HyperText_Markup_Language
10) Eric A. Meyer, CSS The Definitive Guide: OReilly, 2006
11) Matt Lambert, Learning Bootstrap 4: Packt Publishing 2016
12) Jake Spurlock, Bootstrap: Responsive Web Development: OReilly 2013
13) Matt Stauffer, Laravel: Up and Running: A Framework for Building Modern
PHP Apps: OReilly, 2017
14) Larry Ullman, PHP Advanced and Object-Oriented Programming: Peachpit
Press 2013
15) Chris Pitt, Pro PHP MVC: Apress 2012
16) Architecture of Laravel Applications
http://laravelbook.com/laravel-architecture/
17) Expresie regulat
https://ro.wikipedia.org/wiki/Expresie_regulat
38
18) Hypertext Transfer Protocol
https://ro.wikipedia.org/wiki/Hypertext_Transfer_Protocol
19) UML - Use Case Diagrams
https://www.tutorialspoint.com/uml/uml_use_case_diagram.htm
20) Normalization of Database
http://www.studytonight.com/dbms/database-normalization.php
21) Database: Migrations
https://laravel.com/docs/5.5/migrations
22) Testing: Getting Started
https://laravel.com/docs/5.5/testing
23) Destructive testing
https://en.wikipedia.org/wiki/Destructive_testing

39
ANEXE

Anexa 4.2 1 Anexa 4.2 - 2

Anexa 4.2 3

40
Anexa 4.2 4

Anexa 4.2 5

41
Anexa 4.2 6

Anexa 4.2 7

Anexa 4.2 8

42
Anexa 4.2 9

43

S-ar putea să vă placă și