Tehnologii Web · LAI 4 B F 03 · anul IV, semestrul I

AquaVal, în paisprezece versiuni

Portalul de monitorizare al unei stații de tratare a apei potabile, construit strat cu strat de-a lungul semestrului. Fiecare ședință adaugă un strat peste precedenta, pe același sistem — la final studentul are un portal funcțional, nu treisprezece exerciții fără legătură. Aici sunt publicate toate cele paisprezece stări intermediare, fiecare funcțională și deschisă.

120puncte de măsură
25operatori pe tablou
6 + 6cerințe funcționale și nefuncționale
4 003 200măsurători pe zi, în bază
2 724linii de cod la versiunea finală
42clase în versiunea finală

Studiul de caz

Toate cifrele materialului pornesc de aici. Sistemul observă; comanda rămâne la automatele programabile și la sistemul SCADA existent.

Stația Târgoviște-Nord

Apă potabilă pentru circa 45 000 de locuitori. O sută douăzeci de puncte de măsură — pH, turbiditate, clor rezidual, debit, presiune, nivel — citite la o secundă, la zece secunde sau la un minut, după punct. Un tablou de bord pentru douăzeci și cinci de operatori și o pagină publică de indicatori de calitate, fără autentificare.

Cerințele numerotate CF-1…CF-6 și CNF-1…CNF-6 sunt constrângerile din care ies toate cifrele: cât de proaspătă trebuie să fie o valoare pe ecran, în cât timp se încarcă pagina, cât spațiu are voie să ocupe un an de telemetrie, cât poate sta portalul oprit într-o lună.

Cele paisprezece versiuni

Versiunea cursului N este sistemul așa cum arată la sfârșitul ședinței de laborator din aceeași săptămână. Capitolul indicat este cel a cărui materie o aplică ședința — nu coincide întotdeauna cu numărul ei: baza de date se predă în capitolul 7 și se construiește la lucrarea 5.

1curs

Prima pagină servită

lucrarea 1 · capitolul 1 și 5

Gazdă virtuală proprie și o pagină care raportează cum rulează ea însăși: interfața prin care serverul a chemat interpretorul, procesul care a tratat cererea, numărul de fire al instalării.

21 659octeți — ieșirea deterministă a măsurătorii, identică la toată lumea

Deschide →
6fișiere 87linii de cod 87linii în punctul de intrare
2curs

Marcaj semantic și accesibil

lucrarea 2 · capitolul 2

Structura tabloului de bord, scrisă cu elemente native: titluri, tabel, formular de confirmare. Nicio foaie de stil încă — lucrarea este despre ce livrează marcajul corect de la sine.

7 din 12probe trecute de varianta generică, deși are 34 de atribute ARIA și 159 de linii de cod în plus

Deschide →
9fișiere 92linii de cod 92linii în punctul de intrare
3curs

Sistem de design și aspect

lucrarea 3 · capitolul 3

Aceleași elemente, cu o foaie de stil externă: jetoane de culoare, grilă responsivă, stările alarmei semnalate și altfel decât prin culoare.

2,48 : 1contrastul paletei primite, care arată bine și PICĂ pragul de 3 : 1

Deschide →
10fișiere 69linii de cod 69linii în punctul de intrare
4curs

Date și grafice în browser

lucrarea 4 · capitolul 4

Valorile se citesc dintr-un fișier JSON, se formatează și se desenează. Graficul este SVG produs din cod, fără nicio bibliotecă, cu anularea cererii învechite la fiecare schimbare de interval.

52,8 %dintre valorile aflate la limita de rotunjire coboară în loc să urce

Deschide →
12fișiere 123linii de cod 123linii în punctul de intrare
5curs

Baza de date de telemetrie

lucrarea 5 · capitolul 7

Schema pentru serii de timp, populată cu o zi întreagă din motorul de secvențe al serverului. Tabloul nu mai citește un fișier, ci baza.

4 003 200rânduri pe zi, în două tabele cu conținut identic care diferă numai prin cheia primară

Deschide →
14fișiere 184linii de cod 120linii în punctul de intrare
6curs

Aplicația PHP 8

lucrarea 6 · capitolul 6

Nu funcții noi, ci STRUCTURĂ: un singur fișier accesibil prin URL, rutare, depozite care sunt singurele care știu SQL, șabloane fără logică.

10 → 1fișiere PHP expuse prin URL; unul dintre cele zece era servit ca text simplu, cu parola bazei în el

Deschide →
29fișiere 484linii de cod 10clase 3rute 44linii în punctul de intrare
7curs

API REST și contractul OpenAPI

lucrarea 7 · capitolul 8

Puncte terminale pentru valori curente, istoric și indicatori publici, cu un contract scris care se verifică în două direcții: răspunsurile față de contract, și rutele care nu apar în el.

20,1 ×cât se micșorează lista punctelor când răspunsul cere numai câmpurile folosite

Deschide →
36fișiere 795linii de cod 16clase 7rute 62linii în punctul de intrare
8curs

Formulare, validare, import

lucrarea 8 · capitolul 9

Prima dată când portalul SCRIE: pragurile de alarmă și importul citirilor de contor, cu o singură graniță unde o valoare din afară își schimbă tipul.

17 din 18valori greșite acceptate pe calea implicită — iar tipurile stricte, singure, resping INCLUSIV valoarea corectă

Deschide →
52fișiere 1 358linii de cod 22clase 9rute 72linii în punctul de intrare
9curs

Autentificare și roluri

lucrarea 9 · capitolul 9

Sesiuni configurate din cod, parole derivate cu parametri calibrați, patru roluri și o poartă de acces într-un singur loc, între potrivirea rutei și chemarea acțiunii.

27 / 13perechi rol × operație permise și refuzate, fiecare refuz fiind o decizie luată, nu un loc rămas gol

Deschide →
60fișiere 1 809linii de cod 29clase 11rute 121linii în punctul de intrare
10curs

Timp real cu Server-Sent Events

lucrarea 10 · capitolul 10

Fluxul de valori curente, scris fără nicio bibliotecă, cu reluare de la ultimul eveniment și puls de menținere.

2,7 ×mai puțin transferă interogarea periodică, la intervalul pe care cerința îl admite — contrar a ce se afirmă despre push

Deschide →
64fișiere 2 006linii de cod 32clase 13rute 127linii în punctul de intrare
11curs

Securitate: verificare și remediere

lucrarea 11 · capitolul 11

Antete de apărare, politică de securitate a conținutului cu nonce, escapare după contextul de ieșire, export cu interogare preparată.

10 → 0vectori de activare rămași, pe măsură ce se adaugă directive — măsurat într-un browser adevărat

Deschide →
67fișiere 2 148linii de cod 34clase 14rute 138linii în punctul de intrare
12curs

Performanță: cache și buget

lucrarea 12 · capitolul 12

Pagina publică, în două variante cu același conținut: una nepregătită, una proiectată. Cache cu coalescerea cererilor și buget verificat automat.

250 ×cereri ale clienților pentru fiecare execuție a aplicației — dar numai dacă memoria coalescează cererile care așteaptă aceeași valoare

Deschide →
77fișiere 2 445linii de cod 37clase 15rute 146linii în punctul de intrare
13curs

Livrare în producție

lucrarea 13 · capitolul 14

Configurarea vine din mediu și are un inventar; secretele nu au valoare implicită; jurnal cu valori sensibile ascunse, rotit și comprimat.

15 din 16setări diferă între medii — deci „aceeași aplicație în două medii” este o afirmație despre cod, nu despre sistem

Deschide →
83fișiere 2 663linii de cod 39clase 15rute 154linii în punctul de intrare
14curs

Sistemul complet

lucrarea 14 · capitolul 14

Portalul întreg, cu toate cele treisprezece straturi, plus meta-auditul semestrului și proba de restaurare cronometrată.

125 din 160probe trecute la reluarea tuturor auditurilor — iar auditul lucrării 4 raportează 6 din 10 pe un portal care le satisface pe toate zece

Deschide →
131fișiere 2 724linii de cod 42clase 15rute 67linii în punctul de intrare

O cifră care se vede numai privind toate versiunile deodată

Punctul de intrare are un buget scris: 45 de linii. La lucrarea 6, când este introdus, are 44. Crește cu fiecare strat adăugat și ajunge la 154 la lucrarea 13 — de peste trei ori bugetul lui, fără ca cineva să fi decis asta. La colocviu, rutele și răspunsurile de eroare sunt scoase în clase proprii, iar fișierul coboară la 67 linii.

Depășirea rămasă nu este ascunsă: ori se coboară, ori limita se schimbă în scris, cu motivul. A treia variantă — să rămână așa — este singura greșită.

Ce se poate face aici, și ce nu

Instalarea este publicată pentru a fi citită la curs. Aceeași bază de date este văzută de toate versiunile și de toți vizitatorii deodată.

Demonstrație de citire

Navigarea, tabloul, graficele, alarmele, API-ul și pagina publică funcționează complet. Scrierile sunt oprite — importul de fișiere, schimbarea pragurilor, confirmarea unei alarme — și răspund cu o pagină care spune de ce. Codul care ar fi rulat există și se poate citi; pentru a-l rula efectiv, portalul se instalează local, după lucrarea de laborator.

De la versiunea 9, tabloul cere autentificare. Conturile de mai jos sunt cele din laborator și nu sunt secrete: parolele lor sunt scrise în fișa lucrării.

Fluxul de evenimente al versiunilor 10–14 se deschide și trimite pragurile, apoi tace: telemetria din bază este o zi fixă, iar nimeni nu mai scrie valori noi. Nu este defect — este o demonstrație fără stație care să trimită.

ContRolParolaCe poate face
anaoperatoroperator-de-tura-2026vede tabloul și alarmele
bogdanșef de turăsef-de-tura-2026confirmă alarme, schimbă praguri
carmeninspectorinspector-de-mediu-2026vede tot, nu schimbă nimic
danadministratoradministrator-al-statiei-2026toate operațiile, inclusiv importul

Ce s-a schimbat față de codul din laborator

Portalul a fost scris să stea în rădăcina unei gazde virtuale. Publicarea a paisprezece versiuni sub același nume de gazdă cere trei modificări, toate scrise aici ca să poată fi verificate.

CeDe ce
Un fișier nou în fiecare rădăcină publicată: public/index_demo.phpTrei rânduri. Încarcă adaptarea la prefixul de cale, apoi cheamă index.php, care rămâne neatins. Legăturile absolute din paginile produse sunt prefixate la ieșire, deci niciun șablon nu a fost modificat.
Trei constante din JavaScript devin relative la o valoare globalăFișierele JavaScript sunt servite static și nu trec prin interpretor, deci filtrul de ieșire nu ajunge la ele. Forma aleasă — (window.AQUAVAL_BAZA || '/') + 'flux' — dă exact șirul dinainte când valoarea globală lipsește, deci lucrarea nu se strică.
Directorul src/date redenumit src/DateArhiva a fost făcută pe Windows, unde cele două nume sunt același director. Pe Linux nu sunt, iar încărcătorul automat caută src/Date: fără redenumire, prima cerere care atinge baza de date ar fi eșuat.