Test
Test
Chişinău 2025
1
CUPRINS
INTRODUCERE ....................................................................................................................3
I CONSIDERAȚII TEORETICE
1 INTRODUCERE ÎN CONCEPT ..........................................................................................4
1.1 EXEMPLE ȘI PARTICULARITĂȚI .................................................................................5
2 ASPECTE TEHNICE ...........................................................................................................7
2.1 STRAT DE PREZENTARE (UI BLAZOR) ......................................................................8
2.2 STRAT DE SERVICII ȘI BUSINESS LOGIC ..................................................................9
2.3 STRAT DE DATE (DB CONTEXT, ENTITĂȚI, MIGRAȚII) .........................................11
2.4 SERVICIUL DE E-MAIL ..................................................................................................12
2.5 FLUX DE FUNCȚIONARE ..............................................................................................14
2.6 CONSIDERAȚII DE SECURITATE .................................................................................15
2.7 CONTAINERIZAREA CU DOCKER ...............................................................................16
II REALIZAREA APLICAȚIEI
2
INTRODUCERE
Organizarea activităților zilnice este o provocare pentru mulți utilizatori, iar un Task
Manager simplu, accesibil din browser, reprezintă o soluție eficientă pentru a urmări sarcinile
personale sau profesionale. În loc să depindă de aplicații complexe ori de soluții cu abonament, o
aplicație web minimalistă oferă un mediu rapid, intuitiv și ușor de întreținut.
Tehnologia Blazor Server a fost aleasă pentru a permite dezvoltarea interfeței utilizatorului
în C# și Razor, eliminând nevoia de framework-uri JavaScript suplimentare. Astfel, logica de
prezentare și cea de business pot fi implementate într-un singur limbaj, simplificând procesul de
mentenanță și reducând erorile.
Pentru stocarea datelor, aplicația folosește Entity Framework Core împreună cu o bază de
date SQLite, o alegere potrivită pentru proiecte mici și medii datorită portabilității și configurării
minime.
Scopul principal al aplicației este oferirea unei platforme minimaliste de gestionare a
sarcinilor zilnice, care să includă:
1. Operații CRUD pentru fiecare task;
2. Posibilitatea de a marca sarcinile ca „În lucru” sau „Finalizat”;
3. Filtrarea rapidă a listei de sarcini în funcție de statut.
Aplicația servește și ca bază de cod reutilizabilă pentru viitoare proiecte web dezvoltate cu
Blazor, ea poate fi extinsă ulterior cu funcționalități precum autentificare, trimitere de notificări sau
sincronizare între dispozitive.
Public țintă:
1. Utilizatorilor individuali care doresc să își gestioneze activitățile zilnice într-un mod simplu,
fără dependențe de servicii externe.
2. Echipe mici ce au nevoie de o soluție ușoară pentru urmărirea progresului sarcinilor
comune, fără costuri de licență.
3. Dezvoltatorilor care caută un punct de plecare pentru proiecte mai complexe bazate pe
Blazor și EF Core.
Scenarii de utilizare:
1. Crearea unei liste zilnice de activități personale (ex.: cumpărături, sarcini casnice).
2. Gestionarea unui mini-proiect intern, unde fiecare membru poate adăuga sau marca taskuri
finalizate.
3
3. Demonstrarea principiilor CRUD și a integrării Blazor–Entity Framework Core în contexte
educaționale sau de prototipare rapidă.
Prin simplitatea designului și alegerea unor tehnologii moderne, Task Manager Minimal
devine o aplicație utilă atât pentru utilizatorii finali, cât și pentru dezvoltatori. Blazor Server permite
o experiență interactivă fluidă, EF Core asigură persistența datelor, iar baza de date SQLite oferă
portabilitate maximă. Aceste caracteristici fac din aplicație un exemplu potrivit de proiect educativ
și o bază solidă pentru dezvoltări ulterioare.
I CONSIDERAȚII TEORETICE
1 INRODUCERE ÎN CONCEPT
Într-o lume tot mai digitalizată, gestionarea timpului și organizarea eficientă a activităților
zilnice au devenit priorități pentru oameni din diverse domenii – de la studenți și angajați, până la
manageri, freelanceri și chiar pentru uz personal. Ritmul alert al vieții moderne, diversitatea
sarcinilor pe care trebuie să le realizăm și multitudinea de informații cu care interacționăm zilnic
creează o nevoie constantă de instrumente care să ajute la structurarea și monitorizarea activităților.
În acest context, aplicațiile și site-urile specializate în task management au câștigat
popularitate, fiind utilizate atât la nivel individual, cât și în cadrul echipelor sau organizațiilor.
Aceste instrumente se bazează pe un principiu simplu, dar extrem de eficient: utilizatorul își
notează sarcinile (tasks), cel mai adesea sub forma unor scurte descrieri textuale, și le marchează
drept finalizate după ce sunt îndeplinite. Această metodă de lucru nu doar că oferă o privire clară
asupra progresului activităților, dar contribuie și la crearea unei discipline personale, reducerea
uitărilor și gestionarea mai bună a priorităților.
1. Utilizatorul notează ceea ce are de făcut (de exemplu: „Trimite raportul de vânzări”, „Plimbă
câinele” sau „Învață pentru examen”);
2. Unele aplicații permit adăugarea unor termene limită, alocarea de resurse, stabilirea
nivelului de prioritate sau chiar atașarea unor fișiere și linkuri;
4
3. Fiecare sarcină poate fi urmărită individual, iar unele platforme oferă vizualizări grafice sau
statistici privind eficiența și progresul;
4. Momentul în care activitatea este închisă, ceea ce oferă utilizatorului o satisfacție vizibilă și
o evidență clară a ceea ce a realizat.
Un alt aspect important este faptul că aceste aplicații pot fi utilizate atât pe dispozitive
mobile, cât și pe desktop, iar multe dintre ele oferă sincronizare în cloud, ceea ce înseamnă că
utilizatorul are acces la lista sa de sarcini de pe orice dispozitiv.
Pe lângă funcția de bază – gestionarea taskurilor – aplicațiile moderne pentru organizare
includ adesea și funcționalități avansate precum colaborarea în echipă, integrarea cu alte servicii (de
exemplu, Google Calendar, Slack, Microsoft Outlook), notificări inteligente sau chiar elemente de
gamificare care motivează utilizatorul să fie mai productiv.
Astfel, aceste instrumente digitale reprezintă o combinație între un jurnal clasic de activități
și un asistent personal virtual, având ca scop principal creșterea eficienței și organizarea mai bună a
timpului.
Pentru a înțelege mai bine cum funcționează aceste aplicații și ce le face utile, putem analiza
câteva dintre cele mai populare soluții existente pe piață.
Todoist este una dintre cele mai cunoscute aplicații de tip to-do list. Interfața este simplă și
intuitivă, bazată pe adăugarea rapidă de taskuri și organizarea lor în proiecte. Printre
funcționalitățile sale se numără: setarea de termene limită, crearea de sarcini recurente, utilizarea
etichetelor (tags) și posibilitatea de colaborare cu alți utilizatori. O particularitate a Todoist este
folosirea unui sistem de punctaj numit Karma, care motivează utilizatorul să-și îndeplinească
sarcinile constant.
Microsoft To Do este o aplicație dezvoltată de Microsoft și se integrează foarte bine cu alte
produse din ecosistemul său, precum Outlook sau Microsoft 365. Microsoft To Do oferă
posibilitatea de a organiza sarcinile în liste tematice, de a seta notificări și alerte, precum și de a
sincroniza activitățile între dispozitive. Este apreciată în special de utilizatorii care lucrează deja cu
suita Microsoft, datorită integrării fluide.
Trello se diferențiază prin modul vizual de organizare: utilizează panouri (boards), liste și
carduri pentru gestionarea sarcinilor. Fiecare card poate conține descrieri, checklisturi, fișiere
atașate sau comentarii, ceea ce îl face foarte util pentru munca în echipă. Este des folosit în proiecte
5
colaborative, în special în mediile de dezvoltare software sau marketing. În comparație cu
aplicațiile clasice de tip listă, Trello oferă o imagine de ansamblu mult mai clară asupra etapelor
unui proiect.
Google Keep este o aplicație minimalistă de luare de notițe și gestionare de sarcini. Spre
deosebire de altele, se concentrează pe simplitate: utilizatorii pot adăuga liste de activități, note
rapide, imagini sau înregistrări vocale. Este foarte ușor de folosit, dar nu are funcții complexe de
management de proiect. Punctul său forte este integrarea cu Google Drive și Google Calendar.
Asana este o platformă orientată în special spre echipe și proiecte mai complexe. Permite
crearea de sarcini, atribuirea acestora către membri ai echipei, stabilirea unor deadline-uri,
urmărirea progresului și chiar vizualizarea activităților sub formă de cronograme (timelines). În
comparație cu Todoist sau Microsoft To Do, Asana este mult mai robust și mai potrivit pentru
organizații mari.
Asemănări:
1. Toate aceste aplicații permit crearea de sarcini sub formă de text;
2. Majoritatea oferă posibilitatea de a seta termene limită și notificări;
3. Sincronizarea între dispozitive și accesul la listă din cloud este o caracteristică comună;
4. Oferă un sentiment de progres și motivație prin marcarea sarcinilor ca finalizate.
Diferențe:
1. Aplicații precum Google Keep sunt minimaliste, în timp ce Asana sau Trello oferă
instrumente complexe pentru echipe;
2. Unele sunt gândite pentru uz personal (ex. Microsoft To Do, Todoist), altele pentru
colaborare de echipă (ex. Trello, Asana);
3. Trello se bazează pe carduri vizuale, Google Keep pe note simple, iar Todoist pe liste
structurate;
4. Integrarea cu alte servicii – Microsoft To Do se leagă de ecosistemul Microsoft, Google
Keep de ecosistemul Google, iar Asana oferă integrare cu numeroase aplicații terțe.
6
2 ASPECTE TEHNICE
Aplicația creată se bazează pe tehnologii moderne din ecosistemul .NET, care permit
dezvoltarea rapidă și eficientă a aplicațiilor web interactive. Alegerea combinației dintre Blazor,
Entity Framework Core și SQLite oferă un echilibru între simplitate, performanță și ușurința în
gestionarea datelor.
Blazor reprezintă o tehnologie dezvoltată de Microsoft ce permite construirea de aplicații
web moderne folosind limbajul C#, fără a fi necesar JavaScript pentru logica de interfață. În cazul
acestei aplicații, Blazor a fost utilizat pentru a implementa partea vizuală și interactivă, respectiv
pentru crearea componentelor care gestionează sarcinile (tasks). Utilizatorul are posibilitatea de a
adăuga, edita și marca activitățile ca finalizate, toate aceste acțiuni fiind gestionate printr-o interfață
reactivă și prietenoasă. Un avantaj important al Blazor este faptul că logica aplicației și partea de
interfață se bazează pe același limbaj (C#), ceea ce reduce complexitatea și îmbunătățește
mentenanța codului.
Pentru gestionarea datelor, aplicația utilizează Entity Framework Core (EF Core), un ORM
(Object Relational Mapper) puternic și flexibil. Acesta permite dezvoltatorului să lucreze cu obiecte
și clase C# în loc de a scrie manual interogări SQL complexe. În cadrul aplicației, EF Core a fost
folosit pentru a crea modelul de date (de exemplu, clasa Task care conține câmpuri precum Id, Titlu,
Descriere, DataLimita, EsteFinalizat) și pentru a gestiona operațiile CRUD (Create, Read, Update,
Delete). Acest lucru asigură o integrare fluentă între partea de interfață (Blazor) și baza de date,
reducând riscul de erori și simplificând accesul la date.
Pentru stocarea datelor, a fost aleasă baza de date SQLite, cunoscută pentru simplitatea și
portabilitatea sa. SQLite este o bază de date relațională, dar spre deosebire de soluții mai complexe
precum SQL Server sau PostgreSQL, aceasta se bazează pe un singur fișier stocat local, ceea ce o
face extrem de ușor de configurat și distribuit. În aplicația dezvoltată, SQLite gestionează toate
înregistrările privind sarcinile utilizatorului, inclusiv statusul lor (finalizat/nefinalizat). Această
alegere este potrivită pentru aplicațiile de dimensiuni mici și medii, unde nu este necesară o
infrastructură complexă de baze de date.
Fluxul aplicației funcționează astfel: atunci când utilizatorul introduce o sarcină nouă prin
interfața Blazor, aceasta este transmisă către modelul de date gestionat de EF Core, care la rândul
său actualizează baza de date SQLite. Operațiunile inverse, cum ar fi afișarea sarcinilor existente
sau marcarea lor ca finalizate, se realizează prin interogări EF Core, rezultatele fiind afișate dinamic
7
pe interfață. Datorită acestei integrări, utilizatorul percepe aplicația ca pe un sistem fluid și imediat
responsiv.
Avantaje tehnice:
Prin combinația acestor tehnologii, aplicația obține un nivel ridicat de eficiență, fiind în
același timp ușor de extins și întreținut. Aceasta poate reprezenta un punct de pornire solid pentru
dezvoltarea unor aplicații mai complexe de tip task management sau chiar pentru soluții orientate
spre echipe și colaborare.
8
sunt actualizate automat în modelul de date. În același timp, orice schimbare a datelor din backend
este reflectată imediat în interfață, fără a fi nevoie de reîncărcarea paginii.
Stratul de prezentare Blazor se remarcă și prin interactivitate în timp real. Acest lucru este
posibil datorită mecanismului de rendering dinamic și a arhitecturii bazate pe SignalR (în cazul
Blazor Server) sau pe WebAssembly (în cazul Blazor WebAssembly). În contextul aplicațiilor de tip
task management, acest lucru se traduce printr-o experiență fluidă: când un utilizator adaugă sau
finalizează o sarcină, interfața este actualizată instantaneu, fără întreruperi vizibile.
De asemenea, Blazor permite integrarea cu CSS și librării front-end existente, ceea ce ajută
la crearea unor interfețe atractive și adaptabile la diferite tipuri de dispozitive (desktop, tabletă,
mobil). Astfel, stratul UI nu doar afișează datele, ci și asigură o experiență vizuală plăcută și
accesibilă.
În concluzie, stratul de prezentare UI în Blazor reprezintă puntea dintre utilizator și logica
aplicației. Prin utilizarea componentelor, a data binding-ului și a mecanismelor de rendering reactiv,
Blazor oferă un mediu robust pentru dezvoltarea unor interfețe moderne, interactive și ușor de
întreținut. Într-o aplicație de tip task management, acest strat face posibilă gestionarea intuitivă a
activităților zilnice, transformând interacțiunea utilizatorului într-o experiență simplă și eficientă.
În arhitectura unei aplicații moderne, stratul de servicii și business logic ocupă un rol
central, asigurând legătura dintre interfața utilizatorului (UI) și nivelul de stocare a datelor (baza de
date). Într-o aplicație de tip task management, acest strat nu se limitează la transmiterea datelor între
interfață și baza de date, ci implementează logica de afaceri – adică regulile, validările și fluxurile
care definesc modul în care aplicația trebuie să funcționeze dincolo de simpla persistență a
informației.
Stratul de servicii are ca scop abstractizarea accesului la date și oferirea unui set de metode
clare pentru interacțiunea cu acestea. În loc ca interfața să acceseze direct baza de date, aceasta
apelează serviciile care, la rândul lor, gestionează operațiile de creare, citire, actualizare și ștergere
(CRUD) prin intermediul Entity Framework Core. Într-un exemplu concret, pentru adăugarea unui
nou task, interfața trimite cererea către un serviciu, iar acesta se ocupă de validarea datelor și
persistarea lor în baza SQLite.
Logica de business definește regulile prin care aplicația funcționează. În cazul aplicației,
aceasta include:
9
1. stabilirea unor condiții pentru crearea unui task (de exemplu, titlul să nu fie gol sau data
limită să fie validă);
2. marcarea corectă a unui task ca „finalizat” și actualizarea stării sale;
3. gestionarea sarcinilor recurente sau a notificărilor;
4. sortarea și filtrarea listelor de activități în funcție de priorități sau termene limită.
Aceste reguli sunt implementate în clasele de servicii, care asigură că datele introduse de
utilizator respectă logica stabilită și că acțiunile efectuate în interfață se traduc în operații corecte
asupra bazei de date.
Un avantaj important al stratului de servicii și business logic este separarea
responsabilităților: interfața se ocupă doar de prezentare, iar serviciile gestionează regulile
aplicației. Această structură face ca aplicația să fie mai ușor de întreținut și extins. De exemplu,
dacă în viitor se dorește integrarea cu un serviciu extern de trimitere notificări prin e-mail, acest
lucru se poate realiza adăugând o nouă metodă în stratul de servicii, fără a modifica interfața.
Serviciile utilizează Entity Framework Core pentru a accesa baza de date SQLite, dar ascund
complexitatea interogărilor de restul aplicației. Astfel, dacă într-o etapă ulterioară baza de date ar fi
schimbată (de exemplu, de la SQLite la SQL Server), modificările ar afecta doar stratul de servicii,
interfața rămânând neschimbată.
10
În arhitectura unei aplicații moderne, stratul de date reprezintă nivelul responsabil de
gestionarea interacțiunii cu baza de date și de stocarea informațiilor într-un mod structurat. Într-o
aplicație de tip task management realizată cu Blazor, Entity Framework Core și SQLite, acest strat
joacă un rol fundamental, deoarece asigură persistența activităților introduse de utilizatori și permite
recuperarea lor ulterioară. Principalele componente care definesc stratul de date sunt DbContext,
entitățile și migrațiile.
Clasa DbContext este elementul central al stratului de date. Ea acționează ca un intermediar
între aplicație și baza de date, gestionând conexiunea, tranzacțiile și transformarea obiectelor C# în
tabele relaționale (și invers). În cadrul aplicației, DbContext conține colecții de tip DbSet<T>, unde
fiecare T reprezintă o entitate. De exemplu, pentru o aplicație de gestionare a sarcinilor,
DbSet<Task> definește colecția de sarcini care va fi mapată într-un tabel al bazei de date SQLite.
Pe lângă accesul direct la date, DbContext oferă și posibilitatea de a configura relațiile dintre
entități și regulile de validare prin metoda OnModelCreating.
Entitățile sunt clase C# care modelează obiectele reale din aplicație și care sunt transpuse în
tabele ale bazei de date. Fiecare proprietate a unei entități corespunde unei coloane din tabel. De
exemplu, o entitate Task poate conține câmpuri precum Id, Titlu, Descriere, DataLimita și
EsteFinalizat. Id joacă rol de cheie primară, iar celelalte proprietăți definesc atributele unei sarcini.
Avantajul acestei abordări este că dezvoltatorul lucrează cu obiecte orientate pe obiect (OOP), iar
transformarea lor în structuri relaționale este gestionată automat de Entity Framework Core,
eliminând necesitatea scrierii manuale a interogărilor SQL.
Migrațiile sunt mecanismul prin care structura bazei de date evoluează odată cu modificările
aduse în codul sursă. În loc de a modifica manual schema bazei de date, EF Core generează automat
scripturi SQL care aplică schimbările necesare. De exemplu, dacă entitatea Task este modificată
prin adăugarea unui nou câmp Prioritate, o migrație va genera instrucțiunile SQL corespunzătoare
pentru a adăuga coloana respectivă în tabelul din SQLite. Migrațiile asigură consistența dintre cod
și baza de date și oferă posibilitatea de a reveni la versiuni anterioare ale schemei, facilitând astfel
procesul de dezvoltare și testare.
Fluxul tipic de lucru în stratul de date este următorul: interfața (Blazor) transmite datele
către stratul de servicii, acesta le procesează și apelează metodele definite în DbContext. Datele
sunt apoi mapate pe entități și persistate în baza de date SQLite. În sens invers, atunci când
utilizatorul solicită afișarea sarcinilor, DbContext interoghează baza, transformă rezultatele în
obiecte Task, iar acestea sunt trimise mai departe spre interfață.
11
Avantaje ale stratului de date cu EF Core și SQLite:
Funcționalități principale:
Serviciul este conectat la baza de date SQLite prin intermediul Entity Framework
Core, unde sunt gestionate informații precum:
12
4. șabloanele utilizate pentru compunerea mesajelor.
Beneficii:
1. Fiecare mesaj trimis este înregistrat, astfel încât administratorii pot verifica istoricul
comunicărilor;
2. Serviciul poate fi extins cu suport pentru mai multe servere SMTP sau integrat cu
servicii cloud (SendGrid, Mailgun, Amazon SES);
3. Se pot defini reguli pentru trimiterea automată a mesajelor pe baza evenimentelor din
sistem;
4. Prin interfața Blazor, administratorii pot configura rapid parametrii de trimitere
(SMTP, port, autentificare) și pot gestiona șabloanele de e-mail;
Considerații de securitate
Pentru protejarea datelor, autentificarea SMTP se face cu parole criptate, iar conținutul
mesajelor poate fi securizat prin protocoale TLS/SSL. De asemenea, accesul la modulul Mail
Sender este restricționat doar utilizatorilor cu drepturi administrative.
13
În stratul de date, entitățile definesc structura obiectelor ce corespund tabelelor din baza de
date, iar DbContext gestionează tranzacțiile și maparea obiect-relatională (ORM). Dacă există
modificări în structură, acestea sunt propagate prin migrații, care actualizează schema bazei de date
fără a pierde informațiile existente. Rezultatul interogării sau al operației (de exemplu, salvarea unui
nou client) este trimis înapoi către stratul de servicii, unde este prelucrat și pregătit pentru a fi afișat
utilizatorului.
În final, datele revin la stratul de prezentare, unde componenta Blazor actualizează interfața
în timp real, fără a reîncărca întreaga pagină, datorită mecanismului de renderizare reactivă. Astfel,
fluxul de funcționare al aplicației este unul bidirecțional: utilizatorul trimite acțiuni, aplicația le
procesează prin straturile sale, iar rezultatul este redat instantaneu în interfață.
Această abordare stratificată asigură separarea responsabilităților, ceea ce face sistemul mai ușor de
întreținut, extins și testat. În plus, fluxul este scalabil și poate integra servicii suplimentare, cum ar fi
autentificare, notificări sau procesare în cloud.
14
În stratul de date, accentul cade pe protecția bazei de date și a tranzacțiilor. Este important să
se aplice principiul Least Privilege, oferind aplicației doar permisiunile strict necesare. De
asemenea, trebuie configurată criptarea datelor sensibile (ex. parole, date bancare), atât în tranzit
(prin TLS/HTTPS), cât și la nivel de stocare. Migrațiile trebuie gestionate cu grijă pentru a preveni
pierderile de informații și pentru a evita expunerea accidentală a schemelor interne.
Un alt aspect important îl reprezintă gestionarea sesiunilor și token-urilor de autentificare.
Acestea trebuie să aibă un timp limitat de viață, să fie stocate în siguranță (de preferat în cookies
protejate cu flag-urile HttpOnly și Secure) și reînnoite periodic pentru a reduce riscul de furt de
identitate.
Nu în ultimul rând, trebuie implementate măsuri de monitorizare și audit. Logarea acțiunilor
utilizatorilor și a evenimentelor critice (login eșuat, acces neautorizat, modificări ale datelor) este
esențială pentru detectarea tentativelor de atac și pentru reacții rapide.
Prin urmare, considerațiile de securitate pentru un site realizat cu Blazor se bazează pe o
combinație de practici: autentificare și autorizare robustă, validare multiplă a datelor, criptare,
gestionarea responsabilă a permisiunilor și monitorizare constantă. Aceste măsuri integrate pe toate
straturile arhitecturii garantează un nivel ridicat de protecție și încredere pentru utilizatori.
15
Procesul de containerizare presupune scrierea unui fișier Dockerfile, unde se definesc pașii
necesari pentru a construi imaginea aplicației: alegerea unei imagini de bază (ex.
[Link]/dotnet/aspnet:8.0 pentru rularea aplicației Blazor), copierea codului sursă,
restaurarea dependențelor, compilarea și expunerea portului pe care aplicația ascultă. Ulterior,
imaginea rezultată poate fi rulată ca un container folosind comenzi simple, precum docker run.
Pentru aplicațiile mai complexe, care implică mai multe componente, se utilizează Docker
Compose, un instrument ce permite definirea și gestionarea mai multor containere într-un singur
fișier YAML. De exemplu, site-ul Blazor poate rula într-un container, baza de date SQLite sau un
alt sistem de baze de date (ex. PostgreSQL, SQL Server) într-un alt container, iar serviciile
suplimentare (monitorizare, caching) în altele. Acestea comunică între ele prin rețele Docker
interne, asigurând o arhitectură modulară și ușor de scalat.
Un alt aspect important este scalabilitatea. Dacă aplicația este distribuită pe mai mulți
utilizatori sau se așteaptă trafic ridicat, containerele Docker pot fi orchestrate cu Kubernetes sau alte
platforme similare, pentru a crea instanțe multiple ale aplicației și a le distribui eficient în funcție de
sarcină.
În concluzie, containerizarea cu Docker aduce beneficii majore pentru dezvoltarea și
implementarea unui site construit cu Blazor: portabilitate, izolare, consistență între medii, ușurință
în configurare și scalabilitate. Aceasta transformă procesul de livrare a aplicației într-un flux mult
mai rapid, mai sigur și mai predictibil, facilitând atât dezvoltarea locală, cât și implementarea în
producție.
II REALIZAREA APLICAȚIEI
16
aplicației și au fost implementate prin integrarea componentelor Blazor cu logica de business și
baza de date SQLite.
Un al doilea obiectiv a fost introducerea posibilității de a seta statusul sarcinilor. Fiecare task
poate fi marcat ca „În lucru” sau „Finalizat”, iar această informație este salvată în baza de date și
actualizată în timp real în interfață. Pentru o mai bună organizare, am adăugat și o funcționalitate de
filtrare, astfel încât utilizatorul poate alege să vizualizeze doar sarcinile aflate în lucru, doar pe cele
finalizate sau întreaga listă.
Pe lângă cerințele funcționale, am urmărit și respectarea unor cerințe de utilizabilitate.
Interfața trebuia să fie minimalistă, intuitivă și rapid de folosit, fără elemente grafice inutile. În
acest sens, am proiectat o structură simplă, în care partea de sus conține formularul pentru
introducerea sarcinilor, iar zona centrală afișează lista activităților. Am folosit CSS de bază pentru a
păstra o prezentare clară și compatibilă cu diverse rezoluții.
Din punct de vedere al arhitecturii, aplicația a fost gândită în mod stratificat, conform
cerințelor inițiale. Am separat clar stratul de prezentare (UI Blazor), stratul de servicii și business
logic și stratul de date (Entity Framework Core + SQLite). Această separare ne-a permis să
menținem codul modular și ușor de extins. De exemplu, în viitor se poate înlocui SQLite cu SQL
Server fără a modifica interfața sau logica aplicației.
Un alt set de cerințe a vizat securitatea și consistența datelor. Chiar dacă aplicația nu include
încă autentificare și autorizare, am validat datele introduse de utilizatori și am tratat corect
operațiile CRUD pentru a preveni erorile sau pierderile de informații. Totodată, arhitectura este
pregătită pentru a integra un sistem de autentificare bazat pe Identity, în cazul în care aplicația va fi
extinsă.
Extensibilitatea a reprezentat o altă cerință importantă. Pe lângă funcțiile de bază, am
planificat integrarea unui serviciu de trimitere e-mail pentru notificări și confirmări. De asemenea,
aplicația a fost pregătită pentru containerizare cu Docker, ceea ce ne permite să rulăm proiectul în
medii diferite fără configurări suplimentare și să îl integrăm ușor într-un flux DevOps sau într-un
pipeline CI/CD.
Stratul de prezentare al aplicației Task Manager Minimal a fost realizat folosind tehnologia
Blazor Server, care ne-a permis să dezvoltăm interfața utilizatorului în C# și Razor, fără a depinde
de framework-uri suplimentare de tip JavaScript. Alegerea Blazor a avut ca scop menținerea unui
17
cod unificat pe partea de interfață și logică, ceea ce a simplificat dezvoltarea și mentenanța
proiectului.
Pentru afișarea și actualizarea datelor, am folosit data binding bidirecțional, astfel încât
atunci când utilizatorul introduce sau modifică informații în formular, acestea sunt reflectate
imediat în modelul de date. În același timp, modificările operate asupra bazei de date prin
intermediul Entity Framework Core sunt vizibile instantaneu în interfață, fără reîncărcarea paginii.
Din punct de vedere vizual, ne-am propus o interfață minimalistă și ușor de utilizat. Am
folosit un design simplu, fără elemente grafice complexe, pentru a pune accentul pe funcționalitate
și claritate. Layout-ul principal include un meniu de navigare, un formular de adăugare și o zonă
centrală unde se afișează lista sarcinilor. Pentru stilizare s-a utilizat CSS clasic, integrat direct în
Blazor, ceea ce asigură compatibilitate cu diferite rezoluții și dispozitive.
Un alt avantaj oferit de Blazor Server este actualizarea în timp real a interfeței prin
intermediul SignalR. Acest mecanism a fost exploatat pentru a asigura o experiență interactivă
fluidă: atunci când un utilizator adaugă sau finalizează o sarcină, lista este actualizată instantaneu,
fără refresh-uri vizibile.
18
1.1.1 Principii de proiectare a interfeței
La proiectarea stratului de prezentare, s-au avut în vedere mai multe principii fundamentale:
1. Unificarea codului: același limbaj (C#) atât pentru UI, cât și pentru logică.
2. Componentizare: interfața este împărțită în componente reutilizabile.
3. Performanță: Blazor WebAssembly rulează direct în browser.
4. Integrare facilă: comunicare simplă cu API-urile backend.
Un utilizator intră în aplicație, vizualizează sarcinile sale zilnice într-un panou central, aplică
un filtru pentru a vedea doar cele urgente și adaugă rapid o nouă sarcină prin formularul din
interfață. Toate aceste acțiuni sunt gestionate instant, fără reîncărcarea paginii, datorită
mecanismelor de data binding Blazor.
1.1.3 Exemplu simplu de componentă Blazor pentru afișarea și adăugarea unei sarcini
<h3>Lista sarcinilor</h3>
<ul>
<li>
<b>@[Link]</b> - @[Link]()
19
(@([Link] ? "Finalizat" : "În desfășurare"))
</span>
</li>
</ul>
<button @onclick="AddTask">Adaugă</button>
@code {
if ()
[Link](new TaskModel
Title = newTaskTitle,
DueDate = newTaskDate,
IsCompleted = false
});
newTaskTitle = [Link];
20
{
Stratul de servicii și business logic reprezintă legătura dintre interfața utilizatorului și baza
de date, având rolul de a implementa regulile de funcționare ale aplicației. În cadrul proiectului
Task Manager Minimal, acest strat a fost responsabil pentru gestionarea corectă a operațiilor asupra
sarcinilor și pentru validarea datelor introduse de utilizatori.
1. Adăugarea unui task – înainte de salvare, se verifică dacă titlul sarcinii nu este gol și dacă
informațiile introduse respectă regulile de validare;
2. Editarea unui task – serviciul actualizează în baza de date titlul, descrierea și statusul,
asigurând consistența datelor;
3. Ștergerea unui task – logica se ocupă de eliminarea corectă a înregistrării, astfel încât să nu
rămână date orfane;
4. Schimbarea statusului – atunci când un task este marcat ca „Finalizat” sau „În lucru”,
serviciul actualizează starea acestuia și notifică interfața pentru reîmprospătarea listei;
5. Filtrarea sarcinilor – am implementat metode care returnează lista de taskuri în funcție de
criteriul selectat de utilizator („Toate”, „În lucru”, „Finalizate”).
21
Pentru gestionarea datelor, serviciile comunică cu Entity Framework Core și baza de date
SQLite. Interfața nu accesează direct DbContext-ul, ci trimite cererile către servicii, care se ocupă
de maparea obiectelor și de executarea operațiilor. Această separare face ca aplicația să fie mai ușor
de extins: dacă în viitor se dorește schimbarea tipului de bază de date sau integrarea unui API
extern, modificările vor fi făcute doar la nivelul serviciilor, fără a afecta UI-ul.
Stratul de servicii și business logic din Task Manager Minimal asigură respectarea regulilor
aplicației și coordonarea corectă a fluxului de date între interfață și baza de date. El oferă validări
suplimentare, separă clar responsabilitățile și face posibilă extinderea aplicației cu funcționalități
noi, fără a compromite structura existentă. Astfel, acest strat reprezintă fundamentul care garantează
consistența și fiabilitatea întregului sistem.
22
Un utilizator setează o sarcină cu termen pentru ziua următoare. TaskService verifică
validitatea termenului și salvează sarcina în baza de date. În paralel, NotificationService adaugă
această sarcină în lista celor ce necesită remindere, iar a doua zi trimite o notificare prin UI sau
e-mail.
[Link] = _tasks.Count + 1;
_tasks.Add(task);
}
23
if (task != null)
[Link] = true;
}
Stratul de date al aplicației Task Manager Minimal este responsabil pentru gestionarea
persistenței informațiilor și pentru menținerea consistenței acestora. Implementarea s-a realizat
folosind Entity Framework Core (EF Core) ca ORM și SQLite ca sistem de gestiune a bazei de
date. Alegerea SQLite a fost făcută datorită simplității de configurare, a portabilității și a faptului că
baza de date este stocată într-un singur fișier, ceea ce o face ideală pentru proiecte educaționale și
aplicații de dimensiuni reduse.
La baza stratului de date se află clasa DbContext, care gestionează conexiunea cu baza și
expune colecții de tip DbSet. În cadrul proiectului am definit un TaskDbContext, ce conține un
DbSet<TaskItem>. Acesta reprezintă tabelul principal al aplicației, în care sunt stocate toate
sarcinile introduse de utilizatori.
Entitățile definesc structura obiectelor ce urmează să fie mapate în tabele. Pentru aplicația
noastră, am creat entitatea TaskItem, care conține următoarele câmpuri:
- Id, care este un identificator unic al sarcinii, setat ca cheie primară;
- Titlu, ce reprezintă titlul sarcinii, obligatoriu;
- Descriere, detalii suplimentare privind activitatea;
- DataCrearii, momentul în care taskul a fost adăugat;
- EsteFinalizat, câmp boolean care marchează statusul sarcinii.
Această structură a fost aleasă pentru a răspunde cerințelor de bază, dar poate fi extinsă
ulterior prin adăugarea de câmpuri suplimentare (ex. prioritate, termen limită, utilizator asociat).
Pentru gestionarea evoluției bazei de date am folosit mecanismul de migrații al EF Core. La
fiecare modificare a entităților (ex. adăugarea unui nou câmp), am generat o migrație care
actualizează schema bazei de date. Acest proces ne-a permis să păstrăm consistența dintre cod și
baza de date fără a fi nevoie să scriem manual interogări SQL. De exemplu, în momentul adăugării
câmpului DataCrearii, migrația a creat automat coloana corespunzătoare în tabelul SQLite.
24
Fluxul de lucru al stratului de date este simplu și clar: atunci când utilizatorul introduce o
nouă sarcină din interfață, datele sunt trimise către stratul de servicii, care apelează metodele
definite în DbContext. Entitățile sunt mapate la nivel de obiecte C#, iar EF Core le transformă
automat în instrucțiuni SQL ce actualizează baza SQLite. La interogări, procesul se desfășoară
invers: datele sunt preluate din tabel și transformate în obiecte TaskItem, care apoi sunt afișate în
interfața Blazor.
Stratul de date din Task Manager Minimal oferă un mecanism robust și simplificat pentru
gestionarea informațiilor. Prin utilizarea EF Core și a migrațiilor, aplicația rămâne flexibilă, ușor de
întreținut și pregătită pentru extindere, atât la nivelul entităților, cât și prin migrarea către alte tipuri
de baze de date mai complexe.
1. Fiecare entitate reflectă un concept din domeniul aplicației (Task, Category, User);
2. Relațiile dintre entități (one-to-many, many-to-many) sunt configurate clar în model;
3. Baza de date evoluează odată cu aplicația, folosind mecanisme automate de migrare;
4. Utilizarea indexurilor și a lazy loading pentru performanță crescută.
1.3.2 Exemple:
Entități principale
Entitatea TaskEntity
25
// Relație cu categoria
// Relație cu utilizatorul
Entitatea CategoryEntity
Entitatea UserEntity
26
// Un utilizator are mai multe sarcini
DB Context și configurare
[Link]<TaskEntity>()
[Link]<TaskEntity>()
27
Migrații și evoluția bazei de date
Add-Migration InitialCreate
Update-Database
1. Reminder pentru sarcini: trimiterea de notificări pentru sarcinile apropiate de termen;
2. Confirmare și activare cont: dacă aplicația gestionează utilizatori cu autentificare;
3. Rapoarte periodice: trimiterea unui rezumat al activităților săptămânale/lunare;
4. Notificări personalizate: în funcție de preferințele utilizatorului.
Configurare în [Link]
28
{
"EmailSettings": {
"SmtpServer": "[Link]",
"Port": 587,
"SenderEmail": "taskmanager@[Link]",
"Username": "taskmanager@[Link]",
"Password": "parola_securizata"
Serviciul de e-mail în C#
_config = config;
29
{
EnableSsl = true
};
IsBodyHtml = true
};
await [Link](mailMessage);
_emailService = emailService;
30
III TESTAREA APLICAȚIEI
31
Diagrama Use Case – Administrare și monitorizare Docker
CONCLUZIE
32
Unul dintre cele mai importante aspecte ale proiectului a fost alegerea tehnologiilor
potrivite. Folosirea Blazor Server a permis dezvoltarea interfeței utilizatorului direct în C#,
fără a fi necesare framework-uri suplimentare bazate pe JavaScript. Acest lucru a făcut ca
aplicația să fie mai ușor de întreținut și de extins, iar experiența de lucru să fie unitară. Entity
Framework Core a simplificat lucrul cu datele și a oferit posibilitatea implementării rapide a
operațiilor de tip CRUD (Create, Read, Update, Delete), esențiale pentru gestionarea
sarcinilor. Alegerea unei baze de date SQLite a adus portabilitate și simplitate, fiind ușor de
configurat și ideală pentru aplicații de dimensiuni mici și medii.
Prin realizarea acestui proiect, echipa a reușit să combine partea teoretică, legată de
conceptele de task management și arhitectura în straturi, cu partea practică, concretizată într-o
aplicație funcțională. Rezultatul final este un produs software care îmbină utilitatea practică
cu valoarea educativă. Pe de o parte, aplicația poate fi folosită direct de către utilizatori
pentru organizarea activităților zilnice. Pe de altă parte, ea reprezintă un exemplu de cod
33
reutilizabil și o bază solidă pentru dezvoltarea unor proiecte mai complexe, fiind astfel o
resursă valoroasă pentru viitorii dezvoltatori.
BIBLIOGRAFIE
1. Microsoft Docs – [Link] Core Blazor documentation.
[Link]
2. Microsoft Docs – Entity Framework Core documentation.
[Link]
3. SQLite – Official Documentation. Disponibil la: [Link]
4. Docker – Get Started Documentation. [Link]
5. Fowler, Martin – Patterns of Enterprise Application Architecture. Addison-Wesley,
2002.
6. Freeman, Adam; Sanderson, Steve – Pro [Link] Core 8: MVC, Blazor, and Razor
Pages for C# Developers. Apress, 2024.
7. Todoist – The Ultimate Guide to Task Management.
[Link]
8. Trello – How to Use Trello for Task Management. [Link]
9. Microsoft To Do – Official Overview. [Link]
34