Realizarea unei aplica ții software de tip [612386]
Universitatea “Politehnica” d in București
Facultatea de Electronică, Telecomunicații și Tehnologia Informației
Realizarea unei aplica ții software de tip
“Catalog Electronic ”
Proiect de diplomă
prezentat ca cer ință parțială pentru obț inerea titlului de
Inginer în domeniul Electronică și Telecomunicații
programul de studii de licență Calculatoare și Tehnologia Informaței
(INF-CTI)
Conducător ști ințific Absolvent: [anonimizat]. Ovidiu Grigore Sterie Daniel
2017
2
3
4
5
6
7
Copyright © 2017, Sterie Daniel
Toate drepturile rezervate
Autorul acordă UPB dreptul de a reproduce și de a distribui public copii pe hârtie sau
electronice ale acestei lucrări, in formă integrală sau parțială
8
9
Cupr ins
Lista figurilor …………… …………………………………………… ………..11
Lista acronimelor ……………………………… ….…… .…………………… 13
Introducere ……………………………………………………………….… …15
1. Noțiuni teoretice, tehnologii utilizate ………………… …….. ………… …… …… 17
1.1 PHP – Laravel …………………………………………………………… …… .. 17
1.2 MySql ……………………………………………………………… …………… 20
1.3 HTML, CSS, Bootstrap …………………………………………………………. ………………. 21
2. Implementare …… ………… ………………………………………………… …… ….. 23
2.1 Baza de date ………………………………………………………… ……. ……..23
2.2 Log in ……………………………………………………………… …… ……… 24
2.3 Adm inistratorul ……………………………………………………… …… …… 25
2.3.1 Profesori …………………………………………………… …… …… 26
2.3.2 Discipl ine …………………………………………………… …… ….. 29
2.3.3 Elevi ………………………………………………………..… …… … 30
2.4 Cadrul didactic ………………………….…………………………… …… …… 31
2.4.1 Profil ……………………………………………………… ……. …… 31
2.4.2 Clasa ………………………………………………………… ……. …. 34
2.4.3 Lista de note ………………………………………………… ….… …. 35
2.5 Elevul ………………………… …………………………….. ……… …….…… 35
2.5.1 Profil ……………………………………………………… ……. ..….. 36
2.5.2 Note ……………………………………………………… ……. …….. 37
2.5.3 Prezente …………………………………………………… ……. …… 37
2.5.4 Profesori ……………………………………………………….……… 37
2.6 Page not found – 404 …………………………………………………….……… 38
3. Contribu ții, Posibilitaț i de dezvoltare ulterioara …………………. …….. ………………..39
Concluzii …………………… ………… …………………………………………… …….. 41
Bibliografie …………………………… ……… …………………………………… ……. . 43
Anexa 1. Codul sursă rutelor pentru utilizatorul de tip Administrator …………….. 45
Anexa 2. Codul sursă pentru controllerul utilizatorului de tip Administrator … 49
10
11
Lista figuri
Fig 1.1 Arhitectură MVC (Model -View -Controller)
Fig 1 .2 Componente ale unui sistem de baze de date
Fig 2 .1 Schema bazei de date
Fig 2 .2 Pagină de login
Fig 2 .4 Adăugare cadru didactic
Fig 2 .5 Editare cadru didactic
Fig 2 .6 Ștergerea cadrului didactic
Fig 2.7 Exportul cadrelor didactice
Fig 2 .8 Lista disciplinelor
Fig 2 .9 Adăugare disciplină
Fig 2. 10 Ștergerea disciplinei
Fig 2 .11 Lista elevi
Fig 2 .12 Adăugare elev
Fig 2 .13 Detalii profil profesor
Fig 2 .14 Schimbarea parolei
Fig 2 .15 Actualizarea profilului
Fig 2 .16 Elevii apartind unei clase
Fig 2 .17 Adăugare prezente
Fig 2 .18 Adăugare note
Fig 2 .19 Lista notelor
Fig 2 .20 Lista prezențelor
Fig 2 .21 Mediile generale
Fig 2 .22 Profil elev
Fig 2 .23 Actualizarea profilului
Fig 2.24 Note
Fig 2 .25 Prezențe
Fig 2 .26 Lista cadrelor didactice
Fig 2.27 Pagina 404
12
13
Lista acronimelor ( ord ine alfabetica)
CSS – Cascading Style Sheets
HTML – HyperText Markup Language
MVC – Model – View – Controller
Php – Hypertext Preprocessor
14
15
Introducere
În lucrarea de fată se va prezența un serviciu informatizat pentru a gestiona notele elevilor.
Principalul obiectiv în cadrul unui asemenea catalog electronic îl reprezintă creșterea calității actului
educațional prin imbunătătirea parteneriatului dintr e familie și scoală.
Catalogul electronic este o platformă care conține informații despre progresul elevului, ține informați
părinții și imbunătăteste comunicarea între direcțiune, părinți și studenți.
16
17
1. Noț iuni teoretice
1.1 PHP – Laravel
La crearea acestul produs, inovația constă în combinarea limbajului comun (PHP) și un
framework puternic ce reușește să structureze într -un mod foarte clar informațiile și datele, fiind la
îndemâna programatorului (Laravel).
PHP este un limbaj de scripting ce rulează pe un server conceput pentru dezvoltarea web, dar
folosit și ca limbaj de programare în general. Creat de Rasmus Lerdorf în 1994, implementarea
referinței PHP este acum produsă de The PHP Development Team. PHP inițial însemnă Personal
Home Page , dar acum reprezintă un acronim recursiv: Hypertext Preprocessor.
Codul PHP poate fi încorporat în HTML sau HTML5 sau poate fi utilizat în combinație cu
diferite sisteme de șabloane web, sisteme de gestionare a conținutului web și fram ework -uri web.
Codul PHP este procesat, de obicei, de un interpret PHP implementat că un modul în serverul web sau
ca executabil al unei interfețe (CGI).
Programul de server web combină rezultatele codului PHP interpretat și executat, care poate f i
orice tip de date,inclusiv imagini, cu pagină web generată. De asemenea, codul PHP poate fi executat
cu o interfată de linie de comandă (CLI) și poate fi folosit pentru implementarea aplicațiilor grafice
separate.
Laravel este un framework de a plicații web cu o sintaxă expresivă și elegantă. Dezvoltarea
trebuie să fie o experientă plăcută și creativă care să fie cu adevărat implinită. Acesta incearcă să
elimine dificultățile din dezvoltare, facilitând sarcinile comune utilizate în majoritatea pr oiectelor web,
cum ar fi autentificarea, rutarea, sesiunile și cache -ul.
Acest mediu de programare s -a dezvoltat în ultima perioadă, deoarece este un framework open –
source, astfel fiind aduse foarte multe îmbunătățiri din punct de vedere al utiliză rii și al eficienței.
A fost lansat la începutul anului 2012 și a fost creat de Taylor Otwell. În urma unor sondaje, la
sfârșitul anului 2014, s -a constat că acest framework a reușit performanța de a depășii alte framework –
uri cu experientă pe piată d e peste 6 ani, de exemplu Symfony sau Codelgniter, astfel devenind cel mai
popular framework de pe platformă GitHub.
Principalul avantaj al acestui framework îl constituie modularizarea.
Laravel urmareșț e arhitectura MVC (Model -View -Controller) :
18
Fig 1 .1 Arhitectura MVC (Model -View -Controller)
Structura codului este urmatoare:
Rute: Rutele primesc o atenție deosebită în acest framework. În Laravel rutele sunt definite într –
un fișier,acest lucru ajutant în mod special atunci când se dorește un update al sistemului (evitannd
astfel erorilor de tip ‘404 Page not found’). Acestea po t fi definite ca GET, POST, UPDATE,
DELETE. Denumirea rutelor nu mai depinde de numele fișierului apelat, fiecare rută știind ce metodă
să apeleze și ce controller îi corespunde. Pentru integrarea rutelor în aplicație se folosesc aliasuri, as, și
astfel, î n funcție de caz, rutele pot fi schimbate fără a fi necesară o modificare în tot proiectul.
Route::get('list -usert', [
'as' => 'get_list_user',
'uses' => 'Adm inController@getListUsers'
]);
View -uri : View -urile se ocupă cu crearea și afișarea interfeței utilizatorului, dar în același timp
sunt și o parte a logicii deoarece printr -un view există posibilitatea de a introduce date în bază de date.
Laravel aduce un sisteme de creare a template -urilor, Blade.Pentru a nu repetă scrierea unui anumit
bloc, Bladul poate fi extins cu ajutorul unor view -uri mai mici, specifice unei anumite funcționalități.
(Ex: În situații în care anumite formulare se repetă, în pagină pentru crearea unui nou utilizator și în cea
de editare a unui utilizator existent, blade vine în ajutor prin aducerea metodei @implements care
19
implementează un template de formular creat deja separat într -un fișier propriu în interiorul view –
ului.);
Controlere : Controlerele ocupă de prel ucrarea informațiilor primate din view -uri, dar în același
timp interacționează și cu bază de date. Se urmărește că dimensiunea acestuia să fie cât mai mică, astfel
având posibilitatea de a lucra mult mai modularizat, codul fiind împărțit în mai multe clas e;
public function getListUsers(){
$result = $this ->queryService ->getListUsersForAdm in();
if ($result){
return view('adm in.list', ['users' => $result]);
}
return \Redirect::back() ->with Input();
}
Modele : Modelul reprezintă o tabelă din baza de date. În momentul în care se dorește inserarea
datelor în tabele, pentru a nu există conflicte în ceea ce privește datele scrise în coloanele greșite, se
folosește modelul. Laravel aduce în plus Eloquent ORM, astfel îmbunătățind lucrul cu bază de date și
elimnarea anumitor părți din codul SQl, acesta fiind înlocuit de obiecte. În plus, toate modelele au
proprietatea $fillable,proprietate ce elimină posibilitatea de inject (câmpurile pot fi vizibile și utilizabile
sau nu);
public $table = 'users';
protected $fillable = [
'first_name',
'last_name',
'password'
];
protected $hidden = [
'password'
];
Servicii : În servicii există interacțiune propriu zisă cu baza de date.
public function getListUsersForAdm in(){
20
$allUsers = User::get();
if ($allUsers){
return $allUsers;
}
return false;
}
Composer este că un manager pentru PHP cu ajutorul căruia programatorul poate instala
dependențele aplicațiilor în diferite librării în mod automat.
1.2 MySql
Sistemele de baze de date sunt o componenta esentială a vieții de zi cu zi în societatea modernă. În
cursul unei zile, majoritatea persoanelor desfăsoară activităti care implică inte racțiunea cu o bază de
date: de punerea sau extragerea unei sume de bani din bancă, cumpărarea unui produs, căutarea unei
referințe într -o bibliotecă.
Bazele de date pot avea dimensiuni variate(număr de inregistrări), de la câteva zeci de inregistrări
pană la zeci de milioane de inregistrări.
Utilizatorii unei baze de date au posibilitatea să efectueze mai multe categorii de operații asupra
datelor salvate:
• Introducerea de noi date (insert);
• Actualizarea unora din datele existențe(update);
• Ștergerea unor date(delete);
• Interogarea baze de date(query) pentru a regăsii anumite informații, în funcție de anumite filtre.
O bază de date este o colecție de date creată și mentinută co mputerizat, care permite operații de
introducere, ștergere, interogare și actualizarea datelor.
Componentele unei baze de date sunt: hardware, software, utilizatori și date persistente.
Hardware, sistemele de baze de date sunt instalate atâta pe calculatoare standart cât și pe stații
multiprocesor puternice. Un lucru foarte importat în alegerea unui calculator pentru un sistem de baze
de date, este volumul de memorie.
Software, între baza de date și utilizatorii sistemului există un nivel so ftware, numit Sistem de
Gestiune a Bazei de Date(SGBD).
21
Fig 1 .2 Componente ale unui sistem de baze de date
În bazele de date există constrângeri de unicitate, asigurându -se că datele dintr -o coloană sau grup de
coloane sunt unice în raport cu restul înregistrărilor din tabelă.
Există mai multe astfel de constrângeri printre care enumerăm: chei primare, che i străine și chei
secundare.
Cheia primară reprezintă o combinație între o constrângere unique și următoarele restricții:
• nu se admit valori valori null;
• nu poate fi modificată valoarea prin operația de actualizare
Cheia secundară respectă constrângerea de unicitate și admit valori null, dacă nu a fost desemnată de
proiectant ca și cheie primară
Cheia străină face legătura dintre 2 table. Relația care conține cheia străină se numește relație
care referă și relația care conține cheia candidat se numește relație referită.
Interogarea este operația prin care se obțin datele dorite dintr -o bază de date, selectate conform
unuei anumite condiții. Deoarece operația de interogare este cea mai importantă operaț ie de manevrare
a datelor, de multe ori limbajele de manevrare a datelor sunt denumite limbaje de interogare.
1.3 HTML, CSS, Bootstrap
HTML este limbajul standard pentru crearea de pagini web și aplicații web. Cu CSS și
JavaScript formează o triadă de tehnologii de bază pentru World Wide Web. Browserele web primesc
documente HTML de pe un server web sau de pe mașina locală și le transform ă în pagini web
multimedia.
Elementele HTML sunt blocurile de bază ale paginilor HTML. Cu constructe HTML,
imaginile și alte obiecte, cum ar fi formele interactive, pot fi încorporate în pagina redată. Acesta oferă
22
o modalitate de a crea documente structurate prin desemnarea semanticii structurale pentru text, cum ar
fi titluri, paragrafe, liste, linkuri, citate și alte elemente.
Elementele HTML sunt delimitate pr in etichete, scrise cu paranteze unghiulare.
Etichete precum <img /> și < input /> introduc direct conț inutul in pagină. Browserele nu afișează
etichetele HTML, ci le folosesc pentru a interpreta conț inutul pag inii.
HTML poate incorpora programe scrise într -o limbă de scripting, cum ar fi JavaScript, care
afectează comportamentul ș i conținutul paginilor web. Includerea CSS -ului definește aspectul
conținutului.
CSS este folosit pentru a defini stiluri pentru paginile web, inclusiv designul aspectul și
variațiile de afișare pentru diferitele dispozitive și dimensiuni ale ecranelor.
Bootstrap, inițial numit Twitter Blueprint, a fost dezvoltat de Mark Otto și Jacob Thornton în
cadrul Twitter. Înainte de Bootstrap, s -au folosit diferite biblioteci pentru dezvoltarea interfețelor, ceea
ce a dus la inconsecvente și întreținere dificilă.
Bootstrap este un framework open source pentu Javascript. Este o combunati de cod HTML, CSS și
Javascript proiectat pentru a ajuta la crearea interfeței. Acesta a fost desemnat, programat și suportat att
de HTML5 cât și de CSS3.
Bootstrap vine cu m ai multe componente JavaScript sub formă de pluginuri jQuery. Acestea oferă
elemente suplimentare de interfată cu utilizatorul, cum ar fi casetele de dialog și butoanele carusele. Ele
extind, de asemenea, funcționalitatea anumitor elemente de interfată exi stente, inclusiv, de exemplu, o
funcție de auto -completare pentru câmpurile de intrare. În versiunea 2.0, sunt acceptate următoarele
pluginuri JavaScript: Modal, Dropdown, Scrollspy, Tab, Tooltip, Popover, Alertă, Buton, Restrângere,
Carusel și Tiphead.
23
2. Implementare
2.1 Baza de date:
Baza de date este realizată prin intermediul framework -ului Laravel în MySQL ș i
conține 5 tabele relaționate :
• users: id, first_name, last_name, password, type, email, class, address, phone_number,
data_of_birth, master;
• notes: id, note, discipl ine, class, student_id, teacher_id, date;
• presents: id, student_, teacher_id, present, observation, discipl ines;
• discipl ines: id, name, class;
• teacher_discipl ines: teacher_id, discipl ine_id;
Deoarece aplicația prezintă 3 tipuri de utilizatori, câmpul type va primii 3 valori: admin,
teacher, student. În funcție de acesta se vor face redirectionarile din pagina de login, acțiunile și
validările în aplicație.
Tabela teacher_disciplines reprezint ă tabela de legătură dintre tabelele teacher disciplines.
Fig 2 .1 Schema bazei de date
24
2.2 Log in
Pentru fiecare utilizator în parte există o rută pentru logare, ulterior fiind redirecționat către
pagina corespunzatore. .
Aplicatia v ine default cu datele de logare pentru adm inistrator, acestea fi ind: email
‘admin@adm in.com ’ si parola ‘ p@ssw0rd ’.
Pagina de log in este comuna cel trei tipuri de utilizatori:
Fig 2 .2 Pagina de log in
În partea stange se află log -ul aplicație, în dreapta meniul ce conține rutele necesare pentru a se
loga fiecare utilizator.
Acesta pagina este formată dintr -un formular ce conțin două imputuri, unul de tip email, pentru
adresa de email și cel de -al doilea pentru parolă, acesta fiind de tipul password.
După ce emai l-ul și parola au fost introduse, se va face POST -ul prin care datele vor fi trimise
către controller, ca ulterior acestea să fie procesate.
Route::post('/log in-admin', [
'as' => 'post_log in_adm in',
'uses' => 'Adm inController@potLog inAdmin'
]);
Odată ajunse în controller, se vor declara datele ce le așteptăm din formulat în
LoginAdminCommand , urmând să fie trimise către LoginAdminHandler pentru a se face interogarea în
baza de date și login -ul, dacă credentialele introduse sunt corecte.
Dacă de la handler se primește răspunsul isSuccessful , utizatorul va fi redirecționat către
pagină corespunzătoare tipul sau, altfel se va revenii la pagina inițială de login.
25
public function potLog inAdmin(Request $request){
$this ->bus ->addHandler(Log inAdminCommand::class, Log inAdminHandler::class);
$result = $this ->bus ->dispatch(Log inAdminCommand::class, $request ->all(), []);
if($result ->isSuccessful()){
$request ->session() ->flash('flash_success.message' , $re sult->getMessage());
return redirect(route('get_all_teachers'));
}
$request ->session() ->flash('flash_error.message', $result ->getMessage());
return \Redirect::back() ->with Input();
}
Pentru a diferenția cele trei tip uri de utlizatori, în tabela users , există câmpul type cu următoarele
valori: admin, teacher, student.
Laravel, vine în ajutor cu metodă Auth::attemp , acesta făcând verificarea în baza de date a valorilor
primite (email, password), decriptand parola, acesta fiind salvată folosind metoda Hash oferind
securitate Bcrypt. În funcție de rezultatul primit, se returnează și un mesaj de eroare.
public func tion handle(Log inStudentCommand $command) {
if ( Auth::attempt( [ 'email' => $command ->email, 'password' => $command ->password ] ) ) {
$user = Auth::user();
if ($user ->type === 'student'){
return CommandExecutionResult::Success( 'Ati fost autentificat cu succes!' );
}
return CommandExecutionResult::Error( 'Eroare autentificare, verificati email -ul sau parola!'
);
}
return CommandExecutionResult::Error( 'Eroare autentificare, verificati email -ul sau parola!' );
}
2.3 Adm inistratorul
Administratorul are dreptul de a adăugat, modifică sau șterge: profesorii, elevii sau
disciplinele.
26
2.3.1 Profesori
După autentificare, administratorul este redirecționat către o pagină în care avem butonul de
logout, meniul ce conține: Profesori, Discipline și Elevi, tabelul ce conține profesorii și datele acestora,
butonul de adăugare profesor și butonul de exp ortul a l tuturor profesorilor.
În tabel avem urmatoarele coloane: Nume , Prenume , Clasa , Dirig inte, Discipl ina, Email ,
Numar de telefon , Actiuni . Coloana A ctiuni ofer ind posibilitatea de a edita sau ș terge profesorul
selectat.
Fig 2.3 Lista cadre didactice
Pagina de adăugare a profesorilor este constituită dintr -un formular ce are câmpurile
prezentate în tabelul anterior, toate acestea fiind obligatorii, iar email -ul și numărul de telefon sunt
unice în baza de date.
Fig 2 .4 Adaugare cadru didactic
27
În cazul în care un email sau număr de telefon există deja înregistrat, se va returna un mesaj
prin care se va semnaliza acest lucru cu ajutorul validării.
$checkEmail = User::where([
'email' => $command ->email
])->first();
if ($checkEmail){
return CommandExecutionResult::Error('Eroare, acest email este asociat altui cont!');
}
Datele introduse vor fi trimise cu ajutorul rutei de tipul POST /teacher/add , în controller
fiind preludate de funcția postAddTeacher() , urmând ca în handler datele să f ie salvate în tabela users.
Dacă în timpul acestui proces unele date nu corespund conform criterilor, se va returna un mesaj de
eroare
Pentru editarea profesorului se va deschide pagina de adăugare având câmpurile
precompletate cu datele profesorului selectat. Acesta se face cu ajutorul rutei POST teacher/edit/{id} ,
primind ca parametru id -ul profesorul ce urmează să îi fie actualizate datele. Funcția
getEditTeacherByAdmi n(), din controller, preia datele și în funcția getEditTeacherById($id) , se vor
face modificările introduse în view.
Fig 2 .5 Editare profesor
Pentru ștergea profesorului se va deschide un pop -up de confirmare.
28
În urma confirmării se va apela ruta teacher/delete/{id} , ce va trimite id -ul funcției
getDeleteTeacherByAdmin() , urmând ca funcția getDeleteTeacherByAdmin($id) să verifice dacă există
în tabela users și ulterior să se apeleze metoda delete() , pentru ștergerea acestuia din baza de date.
Fig 2 .6 Stergerea cadrului didactic
Exportul profesorilor se va face folosind librăria Maatwebsite . În funcția de creare a
exportului avem metoda în care parametrul $ result reprezintă toți profesorii din baza de date, Profesor –
Raport, numele raportului și xls extensia exportului generat:
Excel::create( 'Profesor -Raport', function ( $excel ) use ( $result ) {
$excel ->sheet( 'Profesor -Raport', function ( $sheet ) use ( $result ) {
$sheet ->fromArray( $result );
} );
} )->export( 'xls' );
Fig 2 .7 Exportul cadrelor didactice
2.3.2 Discipl ine
Pagină corespunzătoare disciplinei conține tabelul cu numele disciplinei, clasa, acțiuni și
posibilitatea de a dauga noi discipline.
În coloana acțiuni avem butonul de editare și butonul de ștergere, corespunzător fiecărei discipline
29
Fig 2 .8 Lista discipl inelor
Pentru a adăuga o disciplină, avem posibilitatea de a introduce numele disciplinei și de a
selecta clasa aferentă.
Odată introduse aceste date, datele vor fi trimise către server apelând ruta /disciplines/add . În
controller funcția postAddDisciplines() , va fac e apelul către command și handler, pentru ca datele să fie
inserate tabela disciplines.
Fig 2 .9 Adaugare discipl ina
Ștergerea disciplinei se va face în urmă confirmării mesajului primit în pop -u.
Se apelează ruta de tip GET /delete/{id} ,{id} – reprezentând id -ul disciplinei alese pentru a fi ste arsa.
Ajuns în controller,funcția getDeleteDiscipline () va apela o funcție din servicii,
getDeleteDisciplineByAdmin($id) , acesta primind parametrul id,pentru a putea face interogarea în baza
de date și ulterior ștergerea acestei înregistrări
Fig 2 .10 Stergerea discipl inei
30
2.3.3 Elevi
În pagina elevi avem un tabel cu datele elevilor, un buton de adăugare elevi și un buton
pentru exportul acestora în format excel.
Tabelul are următoarele coloane: Nume , Prenume , Clasă , Data nașterii , Email , Număr de
telefon , Adresă , Acțiuni (ștergere, editare).
Fig 2 .11 Lista elevi
Pagina de adăugare a elevilor este formată din câmpurile corespunzătoare tabelului anterior.
După completarea acestora, este apelată ruta de tipul POST student/add , funcția getAddStudent () din
controller prelund datele și în handler cu ajutorul clasei funcției AddStudentByAdminHandler acestea
fiind salvate în tabela users .
Fig 2.12 Adaugare elev
31
Pentru editare este folosit acelas formular având câmpurile precompletate cu datele elevului,
proces asemănător cu cel de adăugare
Pentru a șterge un elev, este necesara a se confirma acest lucru.
Toate tabele folosite pentru rolul de administrator folosesc jqGrid (jQuery), imprumatate din
template -ul SmartAdmin.
Popularea acestora se face pe baza unei rute de tip GET, aceasta după ce a fost realizată
interogarea în bază de date, returnând un json, având toate date le.
2.4 Cadrul didactic
Pentru profesor, pagina principală este formată din datele personale. Meniul este format din
profilul cadrului didactic, clasă atribuită, lista notelor acordate și lista prezențelor.
2.4.1 Profil
Toate aceste informații sunt obținute în urma interogării în baza de date și returnate cu
ajutorul unei variabile.
Fig 2.13 Detalii profil cadru didactic
După ce autentificarea a avut loc, profesorul are posibilitatea de aș schimbă parolă din pagina
principală.
Se va încărca un modal în care se va solocita introducerea parolei actuale, noua parolă și
verificarea acesteia.
32
Fig 2 .14 Schimbarea parolei
Câmpurile sunt de tipul password, iar ruta apelată este de tipul POST prof.change -password ,
în controller apelând funcția postChangePassword ().
În funcția getChangePasswordTeacher($request), se apelează metoda Hash::check($request –
>old_password, Aut h::user() ->password) , aceasta comparând parola veche introdusă de profesor, cu
cea existentă în bază de date.
Pentru parola cadrului didactic autentificat se utilizează metoda Auth::user() , acesta returnând
datele existente în tabela users .
Dacă parola introdus ă coincide cu cea introdusă de profesor, se va salvă noua parolă
folosind metoda Hash ¸ metodă ce oferă securitate Bcrypt .
public function getChangePasswordTeacher($request){
if ( Hash::check( $request ->old_password, Auth::user() ->password ) ) {
if ( $request ->new_password != $request ->new_password_aga in ) {
return CommandExecutionResult::Error( 'Parola incorecta!' );
}
$newPassword = [
'password' => Hash::make( $request ->new_password )
];
$newUser = Auth::user() ->update( $newPassword );
return CommandExecutionResult::Success( 'Parola a fost schimbata cu succes!' );
}
return CommandExecutionResult::Error( 'Eroare , reintroduceti vechea parola!' );
}
Editarea profilului presupune deschiderea unui modal ce include un formular, având
câmpurile: Nume, Prenume, Clasă, Diriginte, Disciplină, Email și Număr de telefon.
33
Fig 2 .15 Actualizarea profilului
2.4.2 Clasa
În această pagină este prezenta lista toturor elevilor ce aparțin clasei și datele de contact ale
acestora, posibilitatea de a adaugă note și prezențe.
Fig 2 .16 Elevii apart ind unei clase
Pentru prezența la curs, se va deschide un modal în care se poate bifa dacă elevul este present
sau absent, eventual și posibilitatea de a adaugă observații.
34
Fig 2 .17 Adaugare prezente
Adăugarea notelor se face cu ajutorul unui modal cu următoarele câmpuri: nota și data zile i în
care a obținut notă.
Fig 2 .18 Adaugare note
2.4.3 Lista de note
Notele și prezențele acordate elevilor se regăsesc în aceaste pagină, ordonate crescător în
funcție de data obținerii acestora.
35
Fig 2 .19 Lista notelor
Fig 2 .20 Lista prezențelor
Dacă cadrul didactic este dirigint e, acesta va avea în plus în men iu și opțiunea Medii.
În acesta pagină sunt prezentate datele de contact și media notelor obținute până în prezent.
Fig 2 .21 Mediile generale
2.5 Elevul
În pagina principală sunt prezentate detaliile elevului, butonul pentru schimbarea parolă cât
și cel de editare a profilului.
36
2.5.1 Profil
Meniul este format din următoarele opțiuni: profil, note, prezențe și profesori. Pentru
schimbare parolei se va deschide un modal asemănător ca cel prezentat la profesor.
Fig 2.22 Profil elev
Pentru editarea profilului, se va deschide un modal ce va conține un formular cu câmpurile:
nume, prenume, adresă de email și număr de telefon. Toate aceste câmpuri sunt precompletate cu
datele deja existente în bază de date.
Fig 2 .23 Actualizarea profilului
37
2.5.2 Note
Toate notele obținute de către elev sunt prezentate în pagina Note, acesta fiind alcătuită dintr -un tabel
ce conține numele disciplinei, nota (nota și data) dar și media totală per materie.
Fig 2 .24 Note
2.5.3 Prezenț e
În acesta pagină sunt listate toate prezențele elevului,data și observațiile.
Fig 2 .25 Prezențe
2.5.4 Profesori
În pagină Profesori, se regăsesc profesorii ce predau la clasă elevului, cât și datele acestora de
contact.
Datele profesorilor sunt primite în urma unei interogări în baza de date și în view sunt trimise
sub forma unui array. Pentru a le afișa în tabel, array -ul este parcurs cu ajutorul unui instrucțiuni
repetitive foreach .
38
Fig 2.26 Lista cadrelor didatice
2.6 Page not found – 404
Framework -ul Laravel, vine în ajutor cu metoda Auth::routes(), metodă ce în cazul în care, la
url-ul de bază se adaugă o rută ce nu există, acesta va face redirecționarea automat către pagina 404.
Acesta pagină prezintă un mes aj intuitive și anume , Pagina cautata nu poate fi gasita!
Fig 2.27 Pagina 404
39
3. Contribuții și posibilități de dezvoltare ulterioară
Contribuția mea la acesta lucreare a constat în dezvoltarea aplicației web Catalog Electronic,
studiul framework -ului Laravel și arhitecturii MVC (Model – View – Controller), interacțiunii acestuia
cu baza de date, cât și implementarea template -urilo r externe.
Am analizat metodele de autentificare, validare, creare dinamică a view -urilor cât și
modularizarea acestora, interogări în bază de date cu ajutorul framework -ului Laravel.
La nivel de aplicație am implemantat mai multe funcții și metode apelate din cadrul aplicației
web prin parametrii primiți.
O prima modificare adusă acestui proiect ar fi aceea de a oferii posibilitatea încărcării lucrărilor
susținute de elevi în format pdf sau png/jpeg.
Pentru instituție, acest lucru ar duce la o ar hivare mult mai sigură a lucrărilor pe un termen
mult mai lung și economisirea spațiului,
Având în vedere că jobul ocupă tot timpul, în felul acesta s -ar crea o transparență mai mare
între părinte – elev – cadru didactic.
O posibilă îmbunătățire a r fi introducerea unui formular personalizat în funcție de materie, în
care, cadrul didactic poate atenționa părintele, dacă elevul repetă anumite greșeli, atât de ordine
interioară cât și din punct de vedere educațional.
Acest lucru ar fi posibil prin i mplementarea unui serviciu de alertă prin sms sau email.
O altă îmbunătățire ce s -ar putea aduce aplicației, profesorul să poată adaugă temele date
elevilor și astfel, părinții să aibă în permanență acces la acestea.
40
41
Concluzii
În zilele noastre, aplicațiile informatice sunt extrem de utile în managementul oricărei instituții.
Implementarea unui catalog electronic face posibilă furnizarea corectă și în timp real al
informațiilor atât din punct de vedere decizional, cât și la nivel operațional, astfel obținând o creșterea
eficientă a activității.
Astfel, părintele are acces de oriunde la activitatea elevului, putând urmării evoluția acestuia.
Prin prin intermediul acestei aplicații software de tip “Catalog Electronic”, se aduce un plus
managementului în ceea ce privește profesorii, elevii, notel e și prezențele acestora.
Despre Laravel se poate afirma faptul că este un framework ușor de folosit, bine structurat și cu
o documentație pe înțelesul tuturor. Legătura dintre aplicație și baza de date se face cu ușurință,
simplificând și venind în aj utor cu metode ce înlocuiesc scrierea codului sql.
42
43
6. Bibliografie
[1]https://laravel.com/docs/5.4 [Accesat : 25 august 2017]
[2]https://laracasts.com/ [Accesat : 25 august 2017]
[3]http://www.marplo.net/php -mysql/baze_de_date.html [Accesat : 27 august 2017]
[4]https://developer.chrome.com/apps/app_frameworks [Accesat : 27 august 2017]
[5]https://www.linkedin.com/pulse/w hy-laravel -mvc-framework -you-should -forget –
kali-dass [Accesat: 27 18 august 2017]
[6]http://learningfinest.blogspot.ro/2013/12/principles -of-mvc-for-php-
developers.html [Accesat : 27 august 2017]
[7] Curs: Proiectarea Bazelor de Date (2016), Autor: Felicia Ionescu
44
45
Anexa 1. Codul aferent rutelor pentru utilizatorul de tip Administrator
Route::group(['prefi x' => 'students'], function() {
Route::get('/', [
'as' => 'get_all_students',
'uses' => 'AdminController@getAllStudents'
]);
Route::get('/all -table', [
'as' => 'get_all_students_for_table',
'uses' => 'AdminContr oller@getAllStudentsForTable'
]);
Route::get('/add', [
'as' => 'get_add_student',
'uses' => 'AdminController@getAddStudent'
]);
Route::post('/add -student', [
'as' => 'post_add_student',
'uses' => 'AdminCont roller@postAddStudent'
]);
Route::get('delete/{id}', [
'as' => 'get_delete_student',
'uses' => 'AdminController@getDeleteStudent'
]);
Route::get('edit/{id}', [
'as' => 'get_edit_student_by_admin',
'uses' => 'AdminController@getEditStudentById'
]);
Route::post('edit', [
'as' => 'post_update_student_by_admin',
'uses' => 'AdminController@postUpdateStudentByAdmin'
]);
Route::get('export -student', [
'as' => 'get_export_all_students',
'uses' => 'AdminController@getExportAllStudents'
]);
});
Route::group(['prefix' => 'teacher'], function (){
Route::get('/', [
46
'as' => 'get_all_teachers',
'uses' => 'AdminController@getAllTeachers'
]);
Route::get('all -table', [
'as' => 'get_all_teacher_for_table',
'uses' => 'AdminController@getAllTeacherForTable'
]);
Route::get('add', [
'as' => 'get_add_teacher',
'uses' => 'AdminController@getAddTeacher'
]);
Route::post('add', [
'as' => 'post_add_teacher',
'uses' => 'AdminController@postAddTeacher'
]);
Route::get('delete/{id}', [
'as' => 'get_delete_teacher_by_id',
'uses' => 'AdminController@getDeleteTeacherByAdmin'
]);
Route::get('edit/{id}', [
'as' => 'get_edit_teacher_by_id',
'uses' => 'AdminController@getEditTeacherByAdmin'
]);
Route::post('edit', [
'as' => 'post_edit_teacher_by_id ',
'uses' => 'AdminController@postEditTeacherByAdmin'
]);
Route::get('export -teacher', [
'as' => 'get_export_all_teacher',
'uses' => 'AdminController@getExportAllTeacher'
]);
});
Route::group(['prefix' => 'disciplines'], function(){
Route::get('/', [
'as' => 'get_all_disciplines',
'uses' => 'AdminController@getAllDisciplines'
]);
Route::get('/for -table', [
47
'as' => 'get_all_disciplines_for_table',
'uses' => 'A dminController@getAllDisciplinesForTable'
]);
Route::get('add', [
'as' => 'get_add_disciplines',
'uses' => 'AdminController@getAddDisciplines'
]);
Route::post('add', [
'as' => 'post_add_disciplines',
'uses' => 'AdminController@postAddDisciplines'
]);
Route::get('delete/{id}', [
'as' => 'get_delete_discipline',
'uses' => 'AdminController@getDeleteDiscipline'
]);
Route::get('edit/{id}', [
'as' => 'get_edit_discipline_by_admin',
'uses' => 'AdminController@getEditDisciplineByAdmin'
]);
Route::post('edit', [
'as' => 'post_edit_discipline_by_admin',
'uses' => 'AdminController@postEditDisciplineByAdmin'
]);
});
48
49
Anexa 2 Codul sursa pentru controllerul utilizatorului de tip Administrator
class AdminController extends Controller
{
private $queryService;
public function __construct(QueryService $queryService,CommandBusInterface $commandBus) {
$this ->queryService = $queryService;
parent::__construct($commandBus);
}
public function getLoginAdmin(){
return view('admin.login');
}
public function potLoginAdmin(Request $request){
$this ->bus ->addHandler(LoginAdminCommand::class, LoginAdminHandler::class);
$result = $this ->bus ->dispatch(LoginAdminCommand::class, $request ->all(), []);
if($result ->isSuccessful()){
$request ->session() ->flash('flash_success.message' , $result ->getMessage());
return redirect(route('get_all_teachers'));
}
$request ->session() ->flash('flash_error.message', $result ->getMessa ge());
return \Redirect::back() ->withInput();
}
public function getAddClass(){
return view('admin.add -class');
}
// students ->
public function getAddStudent(){
return view('admin.add -student');
}
public function postAddStudent(Request $request){
$this ->bus ->addHandler(AddStudentByAdminCommand::class, AddStudentByAdminHandler::class);
$result = $this ->bus ->dispatch(AddStudentByAdminCommand::class, $request ->all(), []);
if($re sult->isSuccessful()){
$request ->session() ->flash('flash_success.message' , $result ->getMessage());
return redirect(route('get_all_students'));
}
$request ->session() ->flash('flash_error.message', $result ->getMessage());
return \Redirect::back() ->withInput();
}
50
public function getAllStudents(){
return view('admin.all -students');
}
public function getAllStudentsForTable(Request $request){
$result = $this ->que ryService ->getAllStudents();
if ($result) {
return response() ->json($result);
}
$request ->session() ->flash('error', 'eroare');
return \Redirect::back() ->withInput();
}
public function getDeleteStudent(Re quest $request, $id){
$result = $this ->queryService ->getDeleteStudentByAdmin($id);
if ($result){
$request ->session() ->flash('flash_success.message' , 'Elevul a fost sters cu succes!');
return redirect(route('get_all_ students'));
}
$request ->session() ->flash('flash_error.message','Eroare, elevul nu a fost sters!');
return \Redirect::back() ->withInput();
}
public function getEditStudentById($id){
$result = $this ->queryService ->getStudentById($id);
if ($result) {
return view('admin.edit -student', ['student' => $result]);
}
return \Redirect::back() ->withInput();
}
public function postUpdateStudentByAdmin(Request $request){
$this ->bus ->addHandler(UpdateStudentByAdminCommand::class, UpdateStudentByAdminHandler::class);
$result = $this ->bus ->dispatch(UpdateStudentByAdminCommand::class, $request ->all(), []);
if ($result){
$request ->session() ->flash('flash_ success.message' , $result ->getMessage());
return redirect(route('get_all_students'));
}
$request ->session() ->flash('flash_error.message', $result ->getMessage() );
return \Redirect::back() ->withInput();
}
// disciplines ->
public function getAllDisciplines(){
return view('admin.disciplines.all');
}
51
public function getAddDisciplines(Request $request){
return view('admin.disciplines.add');
}
public function postAddDisciplines(Request $request){
$this ->bus ->addHandler(AddDisciplinesByAdminCommand::class, AddDisciplinesByAdminHandler::class);
$result = $this ->bus ->dispatch(AddDisciplinesByAdminCommand::class, $request ->all(), []);
if ($result){
$request ->session() ->flash('flash_success.message' , $result ->getMessage());
return redirect(route('get_all_disciplines'));
}
$request ->session() ->flash('flash_error.message', $result ->getMessage() );
return \Redirect::back() ->withInput();
}
public function getAllDisciplinesForTable(Request $request){
$result = $this ->queryService ->getAllDisciplinesForTable();
if ($result) {
return response() ->json($resul t);
}
$request ->session() ->flash('error', 'eroare');
return \Redirect::back() ->withInput();
}
public function getDeleteDiscipline(Request $request, $id){
$result = $this ->queryService ->getDeleteDisciplineByAdmin($id );
if ($result){
$request ->session() ->flash('flash_success.message' , 'Disciplica a fost stearsa cu succes!');
return redirect(route('get_all_disciplines'));
}
$request ->session( )->flash('flash_error.message','Eroare, disciplina nu a fost stersa!');
return \Redirect::back() ->withInput();
}
public function getEditDisciplineByAdmin($id){
$result = $this ->queryService ->getDisciplineById($id);
if ($res ult) {
return view('admin.disciplines.edit', ['discipline' => $result]);
}
return \Redirect::back() ->withInput();
}
public function postEditDisciplineByAdmin(Request $request){
$this ->bus ->addHandler( UpdateDisciplineByAdminCommand::class,
UpdateDisciplineByAdminHandler::class);
$result = $this ->bus ->dispatch(UpdateDisciplineByAdminCommand::class, $request ->all(), []);
52
if ($result){
$request ->session() ->flash('flash_success.m essage' , $result ->getMessage());
return redirect(route('get_all_disciplines'));
}
$request ->session() ->flash('flash_error.message', $result ->getMessage() );
return \Redirect::back() ->withInput();
}
// teachers ->
public function getAllTeachers(){
return view('admin.teacher.all');
}
public function getAllTeacherForTable(Request $request){
$result = $this ->queryService ->getAllTeacher($request);
if ($result) {
return response() ->json($result);
}
$request ->session() ->flash('error', 'eroare');
return \Redirect::back() ->withInput();
}
public function getAddTeacher(Request $request){
$result = $this ->queryService ->getAllDisci plines();
if (!$result){
$request ->session() ->flash('flash_error.message' , 'Pentru a adauga profesori, trebuie mai intai adaugate
materiile!');
return \Redirect::back() ->withInput();
}
return view('admin.te acher.add', ['disciplines' => $result]);
}
public function postAddTeacher(Request $request){
$this ->bus ->addHandler(AddTeacherByAdminCommand::class, AddTeacherByAdminHandler::class);
$result = $this ->bus ->dispatch(AddTeacherByAdmin Command::class, $request ->all(), []);
if ($result){
$request ->session() ->flash('flash_success.message' , $result ->getMessage());
return redirect(route('get_all_teachers'));
}
$request ->session( )->flash('flash_error.message', $result ->getMessage() );
return \Redirect::back() ->withInput();
}
public function getDeleteTeacherByAdmin(Request $request, $id){
$result = $this ->queryService ->getDeleteTeacherByAdmin($id);
if ($result){
53
$request ->session() ->flash('flash_success.message' , 'Profesorul a fost stearsa cu succes!');
return redirect(route('get_all_teachers'));
}
$request ->session() ->flash('flash_error.message','Eroare, profesorul nu a fost stersa!');
return \Redirect::back() ->withInput();
}
public function getEditTeacherByAdmin($id){
$result = $this ->queryService ->getTeacherById($id);
$disciplines = $this ->queryService ->getAllDisciplines( );
if ($result){
return view('admin.teacher.edit', ['teacher' => $result, 'disciplines' => $disciplines]);
}
return \Redirect::back() ->withInput();
}
public function postEditTeacherByAdmin(Request $request){
$this ->bus ->addHandler(UpdateTeacherByAdminCommand::class, UpdateTeacherByAdminHandler::class);
$result = $this ->bus ->dispatch(UpdateTeacherByAdminCommand::class, $request ->all(), []);
if ($result){
if ($request ->edit_by_teacher){
$request ->session() ->flash('flash_success.message' , $result ->getMessage());
return redirect(route('get_profile_teacher'));
}
$request ->session() ->flash('flash_success.m essage' , $result ->getMessage());
return redirect(route('get_all_teachers'));
}
$request ->session() ->flash('flash_error.message', $result ->getMessage() );
return \Redirect::back() ->withInput();
}
public functio n getExportAllTeacher(){
$result = $this ->queryService ->getExportAllTeachers();
if ($result){
return redirect(route('get_profile_teacher'));
}
return \Redirect::back() ->withInput();
}
public function get ExportAllStudents(){
$result = $this ->queryService ->getExportAllStudent();
if ($result){
return redirect(route('get_all_students'));
}
return \Redirect::back() ->withInput();
}
54
}
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: Realizarea unei aplica ții software de tip [612386] (ID: 612386)
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.
