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
6fișiere87linii de cod87linii î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
10fișiere69linii de cod69linii î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
29fișiere484linii de cod10clase3rute44linii î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
52fișiere1 358linii de cod22clase9rute72linii î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
131fișiere2 724linii de cod42clase15rute67linii î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ă.
Cont
Rol
Parola
Ce poate face
ana
operator
operator-de-tura-2026
vede tabloul și alarmele
bogdan
șef de tură
sef-de-tura-2026
confirmă alarme, schimbă praguri
carmen
inspector
inspector-de-mediu-2026
vede tot, nu schimbă nimic
dan
administrator
administrator-al-statiei-2026
toate 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.
Ce
De ce
Un fișier nou în fiecare rădăcină publicată: public/index_demo.php
Trei 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/Date
Arhiva 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.