Realizarea Unei Platforme Online de Monitorizare Si Control a Costurilor Utilitatilor Domestice

Cuprins

Introducere

Scurt Istoric

În 1972 Theodore George “Ted” Paraskevakos a dezvoltat un sistem de monitorizare cu senzori, care folosea transmisia digitala atât pentru securitate, incendii și alarma medicală cât și pentru citirea contoarelor de utilități. Această tehnologie a fost una revoluționară pentru sistemul automat de indentificare a liniei telefonice, acum cunoscut sub numele de ID apelant.

În 1974 Dl. Paraskevakos a fost patentat de către U.S. pentru această tehnologie. În 1977 el a lansat  Metretek, Inc. care a produs și a dezvoltat primul contor de citire automat la distanță.

Momentul în care acest sistem a cunoscut o mare dezvoltare a fost abia în anul 1985 când au fost înființate mai multe astfel de proiecte la o scară largă. Hackensack Water Co. and Equitable Gas Go. au fost primii care au realizat astfel de proiecte bazate pe AMR pentru contoare de apă și contoare de gaz. În 1987 Philadelphia Electric Co. confruntându-se cu multe contoare inaccesibile au instalat mii de unități de distribuție AMR pentru a rezolva aceasta problemă. De atunci această tehnologie a devenit din ce în ce mai viabilă zilnic.

Datorită progresului tehnologiei (a microprocesoarelor, a costului tehnologiei pe suprafață si a tehnicii de asamblare) se pot produce sisteme de încredere la un preț accesibil care justifică folosirea acestor sisteme AMR pe o scară largă.

Contextul și domeniul temei

Automatic meter reading (AMR) este o tehnologie ce citește date automat de la aparatele de măsurat precum apometre, aparate de masură a energiei și transferă aceste date unei baze de date centrală pentru analiză.

Sistemele AMR constă din trei părți principale :

Contoarele de apă, gaz sau curent sunt echipate cu o interfață electromecanică/electro-optică care convertește semnalele analogice transmise de contoare în informație electronică ce poate fi prelucrată și trimisă spre centru. În multe cazuri interfața de comunicare este bidirecțională pentru a putea permite senzorului să primească informație de la centru. Pentru a putea procesa semnalele inițiale transmise de interfața contoarelor e nevoie de o unitate de control. Aceasta este formată din sursă de alimentare, microcomputer, memorie RAM și circuite electronice necesare operațiilor de convertire.

Sistemul de comunicații utilizat pentru transmiterea datelor. De obicei datele pot fi trimise de la senzori la centrul de utilități prin telefon, linie de curent, satelit, cablu sau radio frecvență. Aceste date sunt prelevate constant în timp real.

Echipamentul centrului de utilități include modemuri, receivere, un domeniu de hosting, unul sau mai multe calculatoare care adună informația.

Principalul scop al acestor contoare a fost să faciliteze obținerea datelor. De exemplu, multe contoare sunt instalate în locații care necesită întâlnirea cu proprietarul pentru a putea avea acces la index. Pentru că accesul la contoare era îngreunat factura la utilități de multe ori era calculată pe baza estimărilor celor 12 luni calendaristice.

Astfel unul din avantajele acestei tehnologii este că furnzorii de utilități nu mai sunt nevoiți să se deplaseze la locația fizică a senzorului, ci pot citi datele de la aparatele de măsurat indiferent de dificultățile de acces în spațiile unde sunt montate și au o mare libertate a alegerii momentului citirii.

De asemenea un alt avantaj al acestor sisteme este faptul că asigură corectitudinea indecșilor citiți cât și economia de timp pentru proprietarii de apartamente. Consumatorii pot vedea astfel în orice moment câte utilități au consumat.

Cu ajutorul unui astfel de sistem se poate depista dacă există pierderi sau posibilitatea de fraudă.

Figure 1: Structura unui sistem AMR

Tema propriu-zisă

Această lucrare își propune să realizeze o platformă online de monitorizare și control al costurilor utilităților domestice. Aplicația permite utilizatorilor domestici vizualizarea consumului pentru utilități (vizualizarea indecșilor pentru apă, gaz, curent, vizualizarea prețurilor acestor utilități dar și vizualizarea totalului de plată pentru fiecare lună a anului calendaristic).

Implementarea a fost facută în contextual unui bloc cu nouă etaje, fiecare etaj având câte trei apartamente pe scară. Fiecare apartament trebuie să fie dotat cu contoare cu citire automată (contoare de tip AMR), fiecare având un cod unic prin care poate fi identificat de către sistem. Citirea contoarelor se face automat la cererea administratorului sistemului.

Lucrarea este compusă din două părți principale: prima parte își propune să explice fundamentele teoretice necesare pentru înțelegerea domeniului din care face parte problema tratată, iar a doua conține detalii de proiectare și implementare a sistemului dorit, cu accent pe îmbunătățirile aduse unor sisteme existente și pe implicațiile generate de acestea.

Capitolul 2 abordează toate fundamentele teoretice necesare pentru dezvoltarea acestei lucrări de licență. Printre acestea se numără descrierea mediilor de programare : mySQL și C# , .NET dar și lucrul cu MVC-uri (Model-View-Controller).

Capitolul 3 prezintă proiectarea propriu zisă a sistemului : modul de lucru cu controllere, cu view-uri și lucrul cu modele . În acest capitol sunt prezentate mediile de lucru și limbajele de programare specifice.

Capitolul 4 exemplifică modul de lucru și accesare al platformei. Platforma permite accesul a două grupuri de utilizatori : utilizatorii normali (users) și administratorul sistemului (admin).

Fundamentare teoretică :

De-a lungul timpului, scopul unei aplicații a fost acela de a aduna informații dintr-o anumită locație, de a o prelucra după preferințele utilizatorului și pe urmă, de a o afișa utilizatorului. O metodă simplă de a creea o astfel de aplicație este de a aduna toate informațiile și a le prelucra pe toate ca un tot. Această metodă este bună în sensul că este ușor de implementat.

Ulterior însă când se dorește schimbarea uneia din componentele fluxului de date, apar probleme, spre exemplu atunci cand se dorește schimbarea interfeței. O altă problemă ține de logica de business ce trebuie încorporată, logică care și ea este supusă schimbărilor și care merge dincolo de simpla interschimbare de informație.

În astfel de cazuri apare nevoia de a împărții(modulariza) aplicația pentru a delimita părțile componente ale acesteia dar și pentru a putea fi ușor modificate. De asemenea componentele modificate trebuie să fie compatibile cu celelalte module ce formează aplicația.

O soluție la această problemă este arhitectura Model-View-Controller (MVC) care separă partea de stocare a datelor de cea de prezentare și de prelucrare.

Avantajele folosirii ASP.NET MVC sunt :

Separarea conceptelor. Reduce complexitatea unei pagini web.

Controlul integral asupra HTML-ului redat.

Respectarea designului fară stare a web-ului.

Include o componentă de mapare a URL-urilor pentru crearea de aplicații cu URL-uri simple, permițând optimizarea pentru motoarele de căutare.

Deoarece aplicația este împărțită în 3 părți, testarea se poate face mult mai ușor.

Framework extensibil. Framework MVC este proiectat pentru a fi ușor de înlocuit și personalizat.

Nu utilizează conceptele ViewState sau PostBack pe server.

Suportă o varietate de librării pentru AJAX : JQuery, Dojo, Prototype etc.

ASP.NET

ASP.NET este un framework de dezvoltare creat de Microsoft pentru realizarea paginilor web și website-uri folosind HTML, CSS și JavaScript. ASP.NET suportă 3 modele de dezvoltare diferite : ASP.NET Web Forms, ASP.NET MVC, și ASP.NET Web Pages. Acesta beneficiază de puterea platformei de dezvoltare .NET și de setul de instrumente oferite de mediul de dezvoltare Visual Studio .NET.

Calitatea cea mai importantă a SQP .NET este timpul redus necesar dezvoltării aplicației. Tehnologia și uneltele de dezoltare de la Microsoft reduc timpul de dezolvatre a aplicațiilor web prin simplitatea limbajului de programare(c# sau Visual Basic .NET) și prin multitudinea de biblioteci de clase si controale .NET.

ASP .NET a fost gândit inițial pentru dezvoltarea aplicațiilor de dimensiuni mari însă se pretează și aplicațiilor mici de genul site-uri personale sau aplicații front-end pentru o bază de date. Datorită tehnologiilor folosite de ASP .NET o aplicație web se poate crea scriind cantitatea minimă de cod.

ASP.NET MVC

MVC a fost descris pentru prima oară în 1979 de către Trygve Reenskaug care pe vremea aceea lucra la Smalltalk din cadrul Xerox PARC. Implementarea originală este descrisă în detaliu în lucrarea Applications Programming în Smalltalk-80: How to use Model–View Controller.

MVC este un concept foarte răspândit în programarea Web.  Scopul MVC este de a ține separate logica business-ului și interfața cu utilizatorul, astfel încât cei care întrețin aplicația să schimbe mult mai ușor o parte, fără a afecta alte părți. MVC, sau Model-View-Controller este un șablon arhitectural folosit în industria de software development (inclusiv web development).

Framework-ul ASP.NET MVC prezintă o alternativă pentru WEB form-urile ASP.NET.

În organizarea MVC, modelul reprezintă informația (datele) de care are nevoie aplicația, view-ul corespunde cu elementele de interfață iar controller-ul reprezintă sistemul comunicativ și decizional ce procesează datele informaționale, facând legatura între model și view.

Modelul reprezintă partea logică a aplicației. El este responsabil de acțiunile și de operațiile asupra datelor, de autentificarea utilizatorilor, de integrarea diverselor clase ce permit procesarea informațiilor din diverse baze de date. Modelul răspunde interogărilor făcute de View și reacționează la schimbările produse în controller. Cu ASP.NET MVC, acesta este văzut mai ales ca un Data Acces Layer – DAL – de un anumit tip, utilizând de exemplu Entity Framework sau NHibernate combinat cu cod specific logicii aplicației.

Pot fi folosite o varietate de tehnologii pentru a implementa logica de acces la baza de date, cum ar fi Microsoft Entity Framework, NHibernate, Subsonic, LINQ la SQL sau clase ADO.NET.

View-ul se ocupă de afișarea datelor (reprezintă interfața cu uitlizatorul UI), practic această parte a programului va avea grijă de cum vede end-userul informația procesată de controller. În view nu se fac prelucrări de date, calcule și nu se adaugă elemente decizionale. O dată ce funcțiile sunt executate de model, viewul-ui îi sunt oferite rezultatele, iar acesta le va trimite către browser. Aceste fișiere pot avea extensia html, asp, aspx, cshtml, vbhtml.

În general view-ul este o mini-aplicație ce ajută la redarea unor informații, având la bază diverse template-uri. Un view corespunde unui singur controller si vice versa.

Controller-ul reprezintă nucleul aplicației. Acesta este o clasă specială ce face legatura între acțiunile userului și partea decizională a aplicației și între model si view. În funcție de nevoile utilizatorului, controller-ul apelează diverse funcții definite special pentru secțiunea de site în care se află user-ul. Funcția se va folosi de model pentru a prelucra (extrage, actualiză) datele, după care informațiile noi vor fi trimise către view, ce le va afișa apoi prin template-uri. Controller-ul interpretează inputurile userului și comandă modelului si view-ul să realizeze ajustările necesare.

Numele controller-ului trebuie să conțină cuvântul cheie Controller. Un controller este o clasă ce extinde clasa System.Web.Mvc.Controller. Un controller expune acțiuni. O acțiune este o metodă în clasa controller-ului care este apelată atunci când utilizatorul introduce un URL în bara de adrese a browser-ului.

O acțiune a unui controller returnează răspunsul cererii de la browser. Framework-ul ASP.NET MVC suportă sașe tipuri standard de rezultat:

ViewResult – Reprezintă HTML.

EmptyResult – Reprezintă nici un rezultat.

RedirectResult – Reprezintă o redirectare spre un alt URL.

RedirectToRouteResult – Reprezintă o redirectare spre o altă acțiune a controlerului.

JsonResult –ul cererii de la browser. Framework-ul ASP.NET MVC suportă sașe tipuri standard de rezultat:

ViewResult – Reprezintă HTML.

EmptyResult – Reprezintă nici un rezultat.

RedirectResult – Reprezintă o redirectare spre un alt URL.

RedirectToRouteResult – Reprezintă o redirectare spre o altă acțiune a controlerului.

JsonResult – Reprezintă un rezultat JavaScript Object Notation ce poate fi folosit într-o aplicație AJAX.

ContentResult – Reprezintă un rezultat text.

Toate aceste clase ce pot fi returnate de o acțiune extind clasa de bază ActionResult. În cele mai multe cazuri, acțiunea controller-ului întoarce un ViewResult.

Model-ul, controller-ul și view-urile implicate în triada MVC trebuie să comunice unul cu altul pentru a putea controla interacțiunea cu userul. Comunicarea între view și controller-ul asociat este simplă, pentru că view-ul și controller-ul sunt special concepute pentru a lucra împreună. Modele pe de altă parte comunică într-o manieră mai complicată.

În Application Programming in Smalltalk-80: How to use Model-View-Controller (MVC), Steve Burbeck descrie două variante de MVC: un model pasiv si un model activ.

Modelul pasiv este cel mai simplu caz și este folosit când un controller manipulează model-ul exclusiv. În acest caz modelul este inactiv. Controller-ul execută toate operațiile necesare: modifică model-ul și informează view-ul că model-ul a fost schimbat și că trebuie reîmprospatat. În acest caz model-ul este complet independent de view și controller, ceea ce înseamnă că model-ul nu are cum să raporteze schimbările sale de stare.

Nu toate modele pot fi pasive deoarece în multe cazuri modelul își schimbă starea. Astfel model-ul trebuie să anunțe viewul aferent. Dacă modelul se schimbă fără implicarea controller-ului acesta se numește model activ. Modelul depinde de view dar de asemenea notifică view-ul despre eventuale modificări.

Pentru a putea dezvolta această aplicație s-au folosit următoarele instrumente de dezvoltare : Microsoft Visual Studio 2014 Express Edition, SQL Server Management Studio 2014 și SQL Server 2014.

Microsoft Visual Studio 2014 Express Edition

Platforma online de monitorizare și control al costurilor utilităților domestice a fost realizată în întregime în Visual Studio 2014 Express Edition. Acest tool a fost creat de Microsoft și este o aplicație software care oferă facilități complete pentru programatori(IDE). Un IDE constă în mod normal dintr-un cod editor sursă, de un debugger și instrumente pentru automatizarea procesului de build.

Visual Studio se folosește pentru realizarea de aplicații ASP.NET, Servicii Web XML, aplicații desktop și aplicații mobile. Acesta folosește platformele de dezvoltare Microsoft: Windows API, Windows Forms, Windows Presentation Foundation, Windows Store și Microsoft Silverlight.

Două trasături importante ale acestui tool sunt IntelliSense(feature pentru auto completarea codului) și Code Refactoring(restructurarea codului existent). IntelliSense este foarte utilă deoarece mărește viteza de muncă prin oferirea de sugestii. Restructurarea codului existent oferă lizibilitate și reduce complexitatea ajutând la mentenabilitatea codului sursă.

Alte instrumente incorporate ale acestui tool sunt : un designer pentru Web Forms, web designer , designer de clasă și designer pentru schema bazei de date . Visual Studio suportă următoarele limbaje de programare : C,C++, Visual C++, Visual Basic .NET, C# și F#. De asemenea suportă XML/XSLT, HTML/XHTML, JavaScript și CSS.

Pentru realizarea acestei lucrări s-au folosit urmatoarele limbaje de programare :C#, HTML, JavaScript și CSS.

Microsoft SQL Server Management Studio 2014

SQL Server Management Studio este un program software creat de Microsoft și care ajută la configurarea, managementul și administrarea tuturor componentelor Microsoft SQL Server. Aplicația ca design seamană foarte mult cu Visual Studio, ceea ce o face foarte familiară.

Acest tool combină un grup larg de instrumente grafice , cu un număr de editori script bogat pentru a oferi acces la SQL Server pentru dezvoltatori și administratori de toate nivelurile de calificare .

Un feature important al acestui tool este Object Explorer care permite userului să navigheze usor prin tot proiectul(șteargă, adauge, să facă operații asupra componentelor serverului). Permite vizualizarea bazelor de date pană în cel mai mic detaliu dar permite și lucrul cu baze de date, cu tabele, cu triggere.

SQL Server 2014

Microsoft SQL ( Structured Query Language) Server este un sistem pentru managementul bazelor de date relaționale dezvoltat de Microsoft. Acest tool este folosit exclusiv pentru lucrul cu baze de date, pentru stocarea și stocarea informațiilor solicitate de către alte aplicații software, fie de pe același calculator sau de la cele care rulează pe un alt calculator într-o rețea.

Limbajele de programare acceptate de acest tool sunt : T-SQL și ANSI SQL.

Un feature nou adus de către această versiune a tool-ului este tehnologia cunoscută sub numele de Hekaton, care a fost dezvoltat de Microsoft Research. Hekaton este o bază de date, optimizată, stocată în memorie care ajută la procesarea tranzacțiilor online. În esență această tehnologie implementează tabele optimizate în memorie și proceduri stocate pentru a putea crește performanța bazei de date.

Descrierea limbajelor de programare

Arhitectura .Net și C#

C# a fost dezolvtat la sfârșitul anilor ’90 ca parte a ansamblului .NET dezvoltat de Microsoft. C# este direct înrudit cu C,C++ și Java și cuprinde câte puțin din fiecare, ex: cuvintele cheie și operatorii sunt moșteniți de la C.

C# a adus multe facilitați inovatoare, cele mai importante dintre ele fiind suportul încorporat pentru componentele software și posibilitatea de a lucra într-un mediu cu limbaj mixt. Acest limbaj de programare are o legatură directă cu arhitectura .NET deoarece el a fost dezvoltat pentru această arhitectura dar și datorită faptului că toate bibliotecile utilizate de C# sunt bibliotecile arhitecturii .NET.

Arhitectura .NET a definit două entități importante : motorul comun de programare(CLR) și biblioteca de clase .NET.

Motorul comun de programare se ocupă de execuția programelor C#. El este responsabil cu programarea într-un limbaj mixt, cu securitatea și portabilitatea programelor. Din urma compilării programelor scrise într-un limbaj mixt nu rezultă un cod executabil ci rezultă un fișier scris într-un limbaj intermediar IL. Acest fișier este portabil pe toate calculatoarele ce dispun de .NET CLR. Codul intermediar este transformat în cod executabil doar cu un compilator numit JIT(Just in Time).

Limbajul C# fiind un limbaj orientat pe obiecte conține cele 4 principii esențiale ale POO : încapsulare, polimorfism, moștenire și reutilizare.

Încapsularea este mecanismul prin care se combină codul și datele, menținându-le integritatea față de lumea exterioară. Codul și datele încapsulate creează un obiect. Obiectele pot fi publice sau private. Clasa este unitatea fundamentală a încapsularii.

Polimorfismul este calitatea care permite unei interfețe să aibe acces la un grup generic de acțiuni : „O singură interfață mai multe metode”.

Prin moștenire un obiect poate dobândi caracteristicile altui obiect. Un obiect poate fi o instanță a unui caz general.

Pentru a putea reduce timpul de muncă o clasă poate fi reutlizată de o mulțime de obiecte. Astfel deoarece nu mai este nevoie să testăm clasa respectivă ci doar să o utilizăm, timpul de muncă poate fi mult îmbunătățit.

T-SQL

Transact SQL este o completare adusă limbajului SQL de către Microsoft și Sybase.SQL este acronimul de la Structured Querry Language și se folosește pentru interogarea, modificarea și definirea bazelor de date relaționale, folosind declarații declarative.

T-SQL extinde standardul SQL pentru a include programarea procedurală, variabile locale, diferite funcții de sprijin pentru prelucrarea șirurilor, a datelor etc. Aceste caracteristici suplimentare fac ca acest limbaj procedural să fie complet.

Acest limbaj permite interogarea unei baze de date, inserarea, updatarea, ștergerea, crearea, adăugarea datelor într-o bază de date. Cele mai cunoscute funcții sunt : AVG, COUNT, MAX, MIN, SUM, funcții pentru lucrul cu fișiere, pentru lucrul cu date :DATEADD, DATEPART, GETDATE(), SYSDATETIME, MONTH etc.

Principalele caracteristici ale limbajelor procedural pentru lucrul cu tabele sunt : procedurile(crearea, chemarea, ștergerea, redenumirea), triggerele(creare, ștergere, activarea și dezactivarea), cursori, view-urile și constrângerile(primary key, unique key, foreign key, etc).

HTML

HTML(HyperText Markup Language) este un limbaj descriptiv, scheletul oricărei pagini Web ce descrie modul în care documentele sunt vizualizate și distribuite pe Internet. Acest limbaj descrie elementele structural ale unei pagini Web: tabele, paragrafe, liste, titluri, legături cu alte pagini etc. HyperText înseamnă ”text cu link-uri în el”.

Un fișier HTML are următoarea structură:

zona head(antet) cu etichetele <head> </head>

zona body(corp) cu etichetele <body> </body>

Documentele HTML implică o structură de elemente HTML imbricate. Acestea sunt indicate în documentul de tag-uri HTML, închise în paranteze unghiulare < >. În general gradul unui element este indicat de o pereche de taguri un start tag < > și o etichetă de final</ >. HTML poate transforma un text în imagini, tabele, liste link-uri, form-uri etc.

Eticheta de start poate include de asemenea atribute în tag, atribute ce indică alte informații, cum ar fi identificatori de secțiuni din documentul de identificare folosit pentru a lega informațiile de stil la prezentarea documentului(ex: eticheta <img> folosit pentru a încorpora imagini).

Cele mai cunoscute elemente de HTML sunt:

titlu de pagină <title></title>

paragrafe <p></p>

fonturi titluri<h1></h1>, <h2></h2>, <h3></h3>, <h4></h4>, <h5></h5>, <h6></h6>

liste <ul> <li></li> </ul>

link-uri <a href=” ”></a>

imagini <img src=” ”>

tabele <table> <tr> <td></td> </tr> </table>

formulare(form, input, textarea, select)

CSS

CSS sau Cascading Styles Sheets, este o modalitate de a stiliza și prezenta HTML. Întrucat HTML este sensul sau conținutul, foaia de stil, CSS, este prezentarea acestui document. Un stil reprezintă o colecție de valori ale atributelor elementelor unui document, valori ce pot fi aplicate întregului document sau doar unei parți din acesta.Printre attribute amintim: mărimea, grosimea, marginile, tipul și culoarea fontului, paragrafe etc.

Datorită folosirii tilurilor se reduce considerabil efortul depus pentru modificările adiționale aduse aspectului și aranjării elementelor în pagină. Operarea de modificări se face doar asupra foilor de stil ce stilizează elementele și nu asupra fiecărui element.

Într-un document se pot aplica 3 tipuri de stiluri: la nivel de element(stilurile sunt include ca attribute în cadrul etichetelor HTML), încapsulate(stilurile sunt incluse în secțiunea de <head> a documentului prin utilizarea marcajului <style>) și legate(stilurile sunt definite în fișiere separate de documentul HTML).

Stilurile inline fac parte din corpul documentului HTML, spre deosebire de stilurile încapsulate și de foile de stiluri externe. Definițiile de stil inline se aplică prin folosirea atributului style în etichetele HTML standard. Deși aceste stiluri inline sunt scrise de fiecare dată într-un document HTML ele sunt prioritare față de stilurile încapsulate sau externe. Mai jos este prezentat un exemplu de stil inline.

<P style="color: red; font-family: Arial; font-weight: bold">

Cele trei tipuri de stiluri pot fi combinate într-un fișier HTML iar relațiile dintre diferite tipuri de stiluri crează efectul de cascadă. Standardul WEB însă indică:

Foile .css sunt urilizate pentru definirea caracteristicilor care se aplică formatării parții commune a tuturor paginilor unei aplicații

Stilurile încapsulate sunt utilizate pentru definirea caracteristicilor care se aplică la formatarea unui anumit element.

Utilizarea stilurilor inline pentru definirea caracteristicilor ce se aplică formatării unui anumit element.

Clasele de stiluri permit definirea unui stil general, care este inserat oriunde este necesar prin intermediul unei singure referiri. Un exemplu de o clasă de stiluri pentru platforma online este prezentat mai jos.

.index-font{

font-size:large;

font-family:'Times New Roman';

text-align:center;

}

Stilul identificator este dat de modul în care acest stil este asociat unui element,prin intermediul atributului id. Definirea acestor stiluri este similară cu definirea claselor de stiluri.

#content-maint{

height:600px;

width:70%;

margin-top:50px;

margin-left: auto;

margin-right: auto;

background:white;

}

Poziționarea în pagină permite așezarea unui obiect într-un anumit loc, folosind coordonatele sale. Atributul cu care se poate realiza acest lucru este position, cu proprietațile left și top.

h2{

margin-left:10px;

font-size:25px;

font-family:'Times New Roman';

text-align:center;

position:absolute;

}

Implementarea aplicației

Implementarea propriu-zisă a bazei de date

ADO .NET(Active X Data Objects) reprezintă o parte importantă a nucleului .NET Framework ce permite conectarea la surse de date diverse, extragerea, manipularea și actualizarea datelor. Sursa de date este în general o bază de date, dar ar putea fi un fișier text, un fișier Excel, un fișier Access sau un fișier XML.

În activitațile zilnice este necesară accesarea și actualizarea informației dintr-o bază de date: lansarea unei comenzi, răsfoirea unui catalog de produse, verificarea evidenței plaților etc. Aceste informații sunt descrise cel mai bine folosind un model relațional ce presupune divizarea informației în seturi consistente și definirea relațiilor dintre aceste seturi.

O aplicație web are nevoie de un sistem complet de gestionare a bazelor de date cum ar fi SQL Server, care asigură gestionarea infrastructurii, fiabilitate și performanță.

Accesarea bazelor de date într-o aplicație web este diferită de accesarea unei baze de date prin intermediul unei aplicații desktop client-server. O problemă pentru aplicațiile tradiționale este faptul că odată ce conexiunea cu baza de date este deschisă, ea rămâne așa până la încheierea executării aplicației. Atunci când sunt deschise mai multe conexiuni server-ul de baze de date va răspunde mai lent la comenzile clienților.

O aplicație Web care lucrează cu baze de date trebuie să rezolve problema modului de deconectare de la Internet. Într-o aplicație de tip ASP .NET serverul procesează codul, returnează paginile HTML și închide conexiunea, astfel încât utilizatorul are senzația că lucrează cu o aplicație care rulează continuu deși el beneficiază doar de pagini statice.

ADO .NET permite lucrul în stil conectat dar și lucrul în stil deconectat,aplicațiile conectându-se la server pentru o scurtă perioadă de timp(doar pentru extragerea/actualizarea datelor). Principalele calitați ale ADO .NET sunt:

Interopabilitate: permite interacționarea cu orice componentă care suportă XML

Durabilitate: ADO .NET permite dezvoltarea arhitecturii unei aplicații datorită modului de transfer a datelor între nivele arhitecturale.

Programabilitate: simplifică programarea pentru diferite task-uri cum ar fi comenzile SQL, ceea ce duce la o creștere a productivitații și la o scădere a numărului de erori.

Performanță: nu mai este necesară conversia explicită a datelor la transferul între aplicații, fapt ce duce la creșterea performanțelor acestora.

Accesibilitate: utilizarea arhitecturii deconectate permite accesul simultan la același set de date. Reducerea numărului de conexiuni deschise simultan determină utilizarea optimă a resurselor.

Prima etapă și cea mai importantă pentru o aplicație ce utilizează baze de date este analiza datelor și realizarea unui model conceptual corespunzător. Pe baza acestei etape se realizează baza de date. Este mult mai ușor să modificăm un model concceptual decât să modificăm o bază de date în care au fost adăugate deja date.

Crearea unui model conceptual presupune o realizare grafică a datelor și a relațiilor dintre acestea. Reprezentarea datelor și a relațiilor într-o formă convențională se numește diagramă entitați-relații sau ERD(Entity Relashionship Diagram).

Într-un model conceptual principalele concepte folosite sunt: atribut, entitate, relație. O entitate este un obiect pentru care se memorează date și are semnificație pentru problema modelată. Un atribut este o caracteristică a unei entitați. O relație este o asociere între două entitați și exprimă legătura dintre ele.

Relațiile între două entitați pot fi de tipul:

1-1(one to one): unei instanțe a primei entitați îi corespunde cel mult o instanță a celei de-a doua entitați.

1-n(one to many): o instanță a primei entitați poate fi asociată cu una sau mai multe instanțe ale celeilalte entități

n-n (many-to-many): o instanță a primei entități poate fi asociată cu una sau mai multe instanțe ale celei de-a doua entități și pot exista mai multe instanțe ale primei entități asociate unei instanțe a celeilate entități.

Astfel în prima etapă am definit nevoile sistemului și am creat o bază de date necesară implementării cerințelor sistemului. Baza de date conține șase tabele fiecare particularizată pentru tipul de operații ce vor fi permise în cadrul ei. În următoarea figură este prezentată baza de date cu legăturile dintre tabele și tipurile de date pentru fiecare câmp al tabelei.

Pentru a facilita accesul la platforma fiecărui apartament din cadrul acestui bloc i-a fost atribuit un cod unic codificat în aplicație cu numele de cod_ap.

Tabela principală este ContorUtil. Această tabelă conține toate codurile unice ale fiecărui apartament și toate codurile unice pentru fiecare contor din apartamentul respectiv. În tabelă, codurile contoarelor sunt ContorApa, ContorGaz, ContorElectricitate. Tabela a fost populată înainte ca userii să aibe acces la platformă. Cheia primară din această tabelă este cod_ap deoarece codul fiecărui apartament este unic. De asemenea codurile contoarelor au fiecare câte o constrângere de unicitate.

Tabela UserUtil este tabela ce reține datele pe care user-ul le adaugă în momentul creeri contului la înregistrarea în platformă. Cheia principală în această tabelă este tot cod_ap deoarece un cont se poate creea doar pentru un singur apartament. Cheia este în relație de one-to-one cu cod_ap din tabela ContorUtil adică dacă în tabela ContorUtil nu există codul introdus de user, acesta nu își poate crea cont pe site.

Următoarele câmpuri din tabelă reprezintă datele personale pe care userul le introduce în momentul creeri contului. Câmpurile UserName (numele utilizatorului de pe site), UserPassword(parola cu care userul se v-a loga pe site) și UserEmail(E-mailul pe care userul poate fi contactat) sunt de tipul varchar(20) adică sunt stringuri de dimensiune fixă – 20 caractere. Câmpurile tabelei trebuiesc neapărat completate pentru că nu acceptă null.

Tabela IndexUtil salvează datele ce le primește de la contoare. Cheia primară în această tabelă este IndexIndex, un int cu auto increment de 1. Deși cod_ap există în această tabelă câmpul cod_ap nu poate fi cheie primară deoarece în fiecare lună se vor primi date de la contoare. Astfel fiecare cod_ap apare în această tabelă de 12 ori. În fiecare început de an calendaristic tabela aceasta v-a fi ștearsă pentru a putea primi datele noi de la contoare. Tabela IndexUtil mai conține o constrângere de tipul unique între câmpurile cod_ap și DataCitire. Cu ajutorul câmpului cod_ap se iau datele trimise de contoare(pe baza cod_ap se știe care contoare au trimis indexul pentru ce apartament).

Deoarece fiecare cod_ap poate apărea de mai multe ori relația dintre tabela de CotorUtil și IndexUtil este one-to-many. Câmpurile din tabelă IndexApa(indexul pentru consumul de apă), IndexGaz(indexul pentru consumul de gaz), IndexElectricitate(indexul pentru consumul de electricitate), DataCitirii(luna calendaristică în care se face citirea) sunt de tipul int.

Tabela PlataUtil păstrează datele despre plată pentru fiecare apartament. Câmpul cod_ap reține informația pentru un apartament. Câmpul DataCitire(luna calendaristică) se preia din tabela de IndexUtil. Câmpurile PlataApa(calculează totalul de plată pentru apă), PlataGaz(calculează totalul de plată pentru gaz), PlataElectricitate(calculează totalul de plată pentru electricitate), PlataTotal(calculează totalul de plată pentru toate utilitățile) sunt de tipul numeric(5,2) adică acceptă numere cu virgulă(5 cifre înainte de virgulă și 2 după virgulă). Cheia primară în acest tabel este IndexPlata un int cu auto increment de 1. Și aici la fel ca în tabela IndexUtil cod_ap nu putea să fie cheie primară deoarece se calculează plata pentru fiecare lună a anului calendaristic. De asemenea la începutul unui nou an toate plățile pe anul trecut se șterg.

Tabela PretUtil este tabela care reține prețul pentru fiecare utilitate. Deoarece aceste prețuri se pot modifica a fost necesară introducerea unei astfel de tabele. Cheia primară în acest tabel este IndexPret un int cu auto increment de 1. Câmpurile PretApa(reprezintă prețul pentru 1mc de apă), PretGaz(reprezintă prețul pentru 1kWh/mc), PretElectricitate(reprezintă prețul pentru 1kWh) sunt de tipul numeric(5,2). Câmpul DataPret este de tipul Date(mm/day/year).

Pe site pe tabul de Maintenance există o secțiune de sugestii și reclamații. Pentru a putea aduna aceste sugestii și reclamații din partea userilor a fost necesară introducerea unei tabele UserComment. Câmpurile User(numele utilizatorului), Email(e-mailul utilizatorului), PhoneNumber(număr de telefon al utilizatorului) sunt de tipul varchar(20) respectiv varchar(10) iar câmpul Comment(userul introduce sugestia sau reclamația) e de tipul text. Cheia primară este index de tipul int cu auto increment de 1.

Pentru a putea lucra/ a avea acces la această bază de date a fost necesară crearea unei conexiuni. Această conexiune a fost asigurată de localhost-ul creat de SQL Server 2014. După instalarea acestui program și crearea unui server localhost s-a reușit conectarea bazei noastre de date la SQL Server(SQL1Express).

În SQL Management pentru a putea avea acces au fost necesare anumite setări care permit conectarea la localhost-ul creat anterior. Pentru conectarea la server trebuie completate câmpurile din figura 6. Deoarece pentru acestă platformă s-a folosit o versiune de SQL Express numele de server este SQLExpress.

Aplicația a fost implementată în Visual Studio 2013. Și aici pentru a avea acces la baza de date a fost necesară crearea unui connection string. Un connection string este un șir care conține informații despre o sursă de conectare și mijloacele de conectare la aceasta. Lista de parametri necesară connection string-ului este: Provider(furnizorul de date pentru conectarea la sursa de date), Data Source(reprezintă serverul,în cazul aplicației fiind un server local), Ititial Catalog(numele bazei de date accesate), Integrated Security(logarea se face cu user-ul configurat pentru Windows), User Id(numele unui user care are acces de logare pe server), Password(parola pentru ID-ul specificat).

Deoarece ambele produse software, Visual Studio cât și SQL Management Studio sunt create de Microsoft, baza de date a putut fi exportată în Visual Studio. O dată cu acest export a fost creat și connection string-ul, un pas foarte important ce a ajutat la scăderea timpului de execuție al aplicației, deoarece un connection string poate fi destul de complicat de scris. Mai jos se poate observa acest connection string.

<connectionStrings><add name="utilitiesDBConnectionString" connectionString="Data Source=ROXANA-PC\SQL1EXPRESS;Initial Catalog=utilitiesDB;Integrated Security=True" providerName="System.Data.SqlClient" />

<add name="utilitiesDBEntities" connectionString="metadata=res://*/Models.Entity.UtilityModel.csdl|res://*/Models.Entity.UtilityModel.ssdl|res://*/Models.Entity.UtilityModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=ROXANA-PC\SQL1EXPRESS;initial catalog=utilitiesDB;user id=sa;password=roxana;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /><add name="utilitiesEntities" connectionString="metadata=res://*/Models.Entity.UtilitiesModel.csdl|res://*/Models.Entity.UtilitiesModel.ssdl|res://*/Models.Entity.UtilitiesModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=ROXANA-PC\SQL1EXPRESS;initial catalog=utilitiesDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

</connectionStrings>

În Visual Studio la crearea unui proiect nou putem vedea structura aplicației în Solution Explorer. Conceptul de MVC se observă datorită foldere-lor Controllers, Models și Views. Pe lângă acestea se poate observa un folder de App_Data ce conține datele din baza de date, Content ce conține toate elementele de grafică, Scripts ce conține toate scripturile din proiect.

Pentru a putea folosi Entity Framework trebuie creat un Entity Data Model. În Visual Studio pentru a ușura munca developeri-lor a fost adăugat un feature de Entity Data Model Wizard care generează un model după baza de date. În Solution Explorer pe folderul Models ->Add new item-> ADO .NET Entity Framework. Mai departe se selectează baza de date și conexiunea la baza de date. În figura 8 este prezentată diagrama importată în Visual Studio.

În cazul aplicației noastre în Models în UtilitiesModel e stocată baza de date. În urma exportului clasele bazei de date sunt în folderul UtilitiesModel.tt iar contextul în UtilitiesModel.Context.tt.

Modelul poate fi creat prin două metode: Code First sau Database First.

Conceptul de Code First ne permite să transformăm clasele noastre într-o bază de date, ceea ce înseamnă că utilizatorul poate defini modelul folosing clasa POCO fară a mai fi nevoie să folosim xml- fișiere EDMX. Modelul creat devine modelul pe care Entity Framework se bazează.

Conceptul de Database First se bazează pe crearea bazei de date înaintea transpunerii ei în clase. Informațiile despre structura bazei de date, a modelului datelor precum și maparea lor sunt stocate în XML într-un fișier .edmx. Designer-ul Entity Fraework oferă o interfață fragică pentru afișarea și editarea fișierului .edmx.

În acest caz s-a folosit conceptul Database First. Framework Entity este un obiect de tipul object-relation mapper care preia structura bazei de date și o transformă în obiecte. Dezvoltatorii folosesc aceste obiecte pentru a interacționa cu baza de date în loc să acceseze direct baza de date.

Clasa principală care coordonează funcționalitatea Entity Framework pentru un model de date este clasa Context a bazei de date. Numele connection stringului(care a fost adăugat în Web.config ) este pasat constructorului clasei context.

public partial class utilitiesEntities : DbContext

{

public utilitiesEntities()

: base("name=utilitiesEntities")

{

}

}

DbContext este folosit de obicei cu un tip derivate care conține proprietatea DbSet< > pentru entitățile de bază ale modelului. Aceste seturi sunt inițializate automat când este creată instanța clasei derivate.

DbContext corespunde bazei de date (sau o colecție de tabele și vizualizări în baza de date) în timp ce DbSet corespunde unui tabel sau o vedere în baza de date. Pentru a avea acces la un obiect se va folosi un DbContext reprezentat printr-un DbSet prin care se poate obține acces, se poate șterge, adăuga și modifica datele din clasă.

Automat la importul bazei de date se crează câte o clasă specific fiecărui tabel. Mai jos este prezentată clasa generată pentru tabelul de ContorUtil. Relațiile cu celalate tabele sunt create cu ajutorul unei clase ICollection cu metodele get/set .

public partial class ContorUtil

{

public ContorUtil()

{

this.IndexUtil = new HashSet<IndexUtil>();

this.PlataUtil = new HashSet<PlataUtil>();

}

public int cod_ap { get; set; }

public int ContorApa { get; set; }

public int ContorGaz { get; set; }

public int ContorElectricitate { get; set; }

public virtual ICollection<IndexUtil> IndexUtil { get; set; }

public virtual ICollection<PlataUtil> PlataUtil { get; set; }

public virtual UserUtil UserUtil { get; set; }

}.

Validarea datelor (spre exemplu : În momentul înregistrării user-ul nu completează un câmp, în dreptul căsuței ce trebuie completată v-a apărea un mesaj de eroare) se poate face folosind libraria System.ComponentModel.DataAnnotation.

Atributele setate pentru fiecare obiect al clasei definesc pattern-uri comune de validare. Atributele setate cauzează MVc-ului să valideze atât partea de validare a clientului cât și partea de validare a serverului fără ca user-ul să scrie o linie în plus de cod. Un exemplu de astfel de validare se poate observa în liniile de cod de mai jos.

public partial class UserComment

{

[Required(ErrorMessage = "You need to fill in a name")]

[DisplayName("Name")]

public string User { get; set; }

[Required(ErrorMessage = "You need to fill in an email address")]

[RegularExpression(@".*@.*", ErrorMessage = "Must be a valid email address")]

[DisplayName("Email address")]

public string Email { get; set; }

[Required(ErrorMessage = "You need to fill in a comment")]

[DisplayName("Your comment")]

public string Comment { get; set; }

[Required(ErrorMessage = "You need to fill in a phone number")]

[DisplayName("Your PhoneNumber")]

public string PhoneNumber { get; set; }

public int index { get; set; }

}

Acțiunile și logica aplicației este realizată de controllere. Din motive de lizibilitate a codului fiecărei tabele îi este asociat un controller(UserUtilsController corespunde tabelei UserUtil ). După generarea realizată cu ajutorul ADO .NET în controllere au fost generate metode specifice oricărei tabele.

Metodele GET și POST sunt metode HTTP (Hypertext Transfer Protocol). Acest protocol a fost creat pentru a permite conexiunea între clienți și server. HTTP funcționează ca un protocol cerere-răspuns între un client și server. Un browser web poate fi clientul iar o aplicație pe un computer care găzduiește un site web poate fi un server.

afișare tabelă, afișare detalii

public ActionResult Index()

{

var contorUtils = db.ContorUtils.Include(c => c.IndexUtil).Include(c => c.PlataUtil).Include(c => c.UserUtil);

return View(contorUtils.ToList());

}

ștergere câmpuri (această metodă preia ca parametru un id care în cazul nostru este codul aparamentului pentru care se dorește ștergerea înregistrării)

// GET: ContorUtils/Delete/5

public ActionResult Delete(int? id)

{

if (id == null)

{

return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

}

ContorUtil contorUtil = db.ContorUtils.Find(id);

if (contorUtil == null)

{

return HttpNotFound();

}

return View(contorUtil);

}

// POST: ContorUtils/Delete/5

[HttpPost, ActionName("Delete")]

[ValidateAntiForgeryToken]

public ActionResult DeleteConfirmed(int id)

{

ContorUtil contorUtil = db.ContorUtils.Find(id); //se caută dupa id

db.ContorUtils.Remove(contorUtil); //se șterge intrarea din baza de date

db.SaveChanges(); //se salvează modificarile în baza de date

return RedirectToAction("Index");

}

editarea câmpurilor existente

// GET: ContorUtils/Edit/5

public ActionResult Edit(int? id)

{

if (id == null)

{

return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

}

ContorUtil contorUtil = db.ContorUtils.Find(id);

if (contorUtil == null)

{

return HttpNotFound();

}

ViewBag.cod_ap = new SelectList(db.IndexUtils, "cod_ap", "cod_ap", contorUtil.cod_ap);

ViewBag.cod_ap = new SelectList(db.PlataUtils, "cod_ap", "cod_ap", contorUtil.cod_ap);

ViewBag.cod_ap = new SelectList(db.UserUtils, "cod_ap", "UserName", contorUtil.cod_ap);

return View(contorUtil);

}

/ POST: ContorUtils/Edit/5

[HttpPost]

[ValidateAntiForgeryToken]

public ActionResult Edit([Bind(Include = "cod_ap,ContorApa,ContorGaz,ContorElectricitate")] ContorUtil contorUtil)

{

if (ModelState.IsValid)

{

db.Entry(contorUtil).State = EntityState.Modified;

db.SaveChanges();

return RedirectToAction("Index");

}

ViewBag.cod_ap = new SelectList(db.IndexUtils, "cod_ap", "cod_ap", contorUtil.cod_ap);

ViewBag.cod_ap = new SelectList(db.PlataUtils, "cod_ap", "cod_ap", contorUtil.cod_ap);

ViewBag.cod_ap = new SelectList(db.UserUtils, "cod_ap", "UserName", contorUtil.cod_ap);

return View(contorUtil);

}

creare inputuri noi conține două metode : una de Get care se apelează în momentul în care apare pe site o cerere de adăugare input iar metoda de POST se apelează în momentul în care user-ul trimite cererea de înregistrare.

// GET: ContorUtils/Create

public ActionResult Create()

{

ViewBag.cod_ap = new SelectList(db.IndexUtils, "cod_ap", "cod_ap");

ViewBag.cod_ap = new SelectList(db.PlataUtils, "cod_ap", "cod_ap");

ViewBag.cod_ap = new SelectList(db.UserUtils, "cod_ap", "UserName");

return View();

}

// POST: ContorUtils/Create

[HttpPost]

[ValidateAntiForgeryToken]

public ActionResult Create([Bind(Include = "cod_ap,ContorApa,ContorGaz,ContorElectricitate")] ContorUtil contorUtil)

{

if (ModelState.IsValid)

{

db.ContorUtils.Add(contorUtil);

db.SaveChanges();

return RedirectToAction("Index");

}

ViewBag.cod_ap = new SelectList(db.IndexUtils, "cod_ap", "cod_ap", contorUtil.cod_ap);

ViewBag.cod_ap = new SelectList(db.PlataUtils, "cod_ap", "cod_ap", contorUtil.cod_ap);

ViewBag.cod_ap = new SelectList(db.UserUtils, "cod_ap", "UserName", contorUtil.cod_ap);

return View(contorUtil);

}

Pe lângă metodele generale pentru crearea funcționalității aplicației a fost necesară crearea unor metode adiționale. Aceste metode sunt specifice fiecărei tabele.

Tabela de PlataUtil este completată automat pe baza tabelei de IndexUtil și PretUtil. Pe baza fiecărui cod_ap se preiau indecși pentru luna curentă din IndexUtil și se calculează prețul într-o metodă. Pentru a citi și a adăuga automat inputuri în tabela de IndexUtil și PlataUtil a fost necesară creearea unei metode ce creează o conexiune la baza de date.

Datele se pot citi automat cu ajutorul unui SqlDataAdaptor executând un querry sql. Pe lângă citire se pot face operații de Select, Insert, Update, Delete toate accesibile în ADO .NET.

Pentru calculului totalului de plată al unui apartament pe o lună am creat o metodă ce deschide o conexiune cu baza de date, preia informațiile din tabel într-un SQLDataAdapter, apoi pe rând pentru fiecare entitate din tabel execută operațiile aritmetice necesare(doar dacă luna este cea curentă) iar la final inserează în baza de date și închide conexiunea cu baza de date.

Clasele DataAdapter generează obiecte ce reprezintă o interfață între baza de date și obiectele DataSet interne aplicației. Ele gestionează conexiunea astfel încât conexiunea să se realizeze doar dacă este necesar. Un obiect DataSet este de fapt un set de tabele relaționale. Datele stocate de un DataSet sunt în format XML.

Administratorul sistemului poate introduce date noi în tabela de IndexUtil din panoul de control al administratorului de pe site. Astfel a fost necesară creearea unor metode noi (asemănătoare cu cea precendentă) pentru calculul totalului de plătit pentru fiecare lună în parte nu doar pentru cea curentă, o metodă pentru ștergerea tuturor înregistrărilor din tabela PlataUtil și o metodă pentru ștergerea unei singure plăți din tabelă. În exemplul de mai jos este prezentat un query sql pentru ștergerea unei singure plăți.

comand = "delete from PlataUtil where cod_ap = " + id_cod_ap.ToString()+ " and DataCitire = " + datacitire.ToString();

da2.InsertCommand = new SqlCommand(comand, con);

da2.InsertCommand.ExecuteNonQuery();

În tabela UserUtil a fost necesară crearea metodelor pentru LogIn-ul și LogOff-ul userilor pe site. După cum am precizat înainte în această lucrare pe site se pot loga două tipuri de utilizatori : useri normali și administratorul blocului. Userii normali au fiecare un cod_ap, iar în aplicație pentru a putea face distincția între cele două tipuri de utilizatori pentru administrator am utilizat cod_ap = 11111. Am atribuit un singur cod unic pentru un singur administrator deoarece pentru un bloc nu este nevoie de mai mulți administratori.

[HttpPost]

public ActionResult LogIn(Models.Entity.UserUtil utilizator)

{

if (ModelState.IsValid) //se verifică userul si parola

{

var v = db.UserUtils.Where(a => a.UserEmail.Equals(utilizator.UserEmail) && a.UserPassword.Equals(utilizator.UserPassword)).FirstOrDefault();

if (v != null)

{

Session["LoggedUsername"] = v.UserEmail.ToString();

Session["cod_ap"] = v.cod_ap.ToString();

//Session["LoggedUserPassword"] = v.UserPassword.ToString();

if (Session["cod_ap"].ToString() == "11111") //se verifică ce tip de user este

{

return RedirectToAction("AdminLogin");//redirectarea la pagină

}

else

{

return RedirectToAction("AfterLogin");

}

}

}

return View();

}

[HttpPost]

[ValidateAntiForgeryToken]

public ActionResult LogOff()

{

Session["LoggedUsername"] = null; //se sterg datele sesiunii

return RedirectToAction("Index", "Home"); //se redirectează spre pagina de start

}

Routarea ASP .NET permite utilizarea de URL-uri cu un anumit pattern pentru a mapa solicitările fișierelor, dar care nu include neapărat numele acestor fișiere în URL. În plus se pot include substituenți într-un model de URL, astfel încât datele variabile pot fi transmise fără a fi necesitat un șir de interogare.

O rută în MVC este un URL care este mapat la o clasă dintr-un controller din aplicație. Pentru a defini o rută se crează o instanță a clasei de rutare definind pattern-ul URL, conducătorul și opțional un nume pentru rută.

În general rutele pentru aplicațiile MVC include {controller}, {action} și {id}. Când o cerere este primită, aceasta este dirijată spre obiectul URLRoutingModule și apoi spre MVCHandler. MVCHandler determină ce controller conține acțiunea respectivă și adaugă sufixul controller. Acțiunea determină ce metodă trebuie chemată din controller.

Biblioteca de clasă .NET Framework este o bibliotecă de tipuri de clase și interfețe incluse în SDK-ul .NET Framework. Această bibliotecă oferă acces la funcționalitatea sistemului și este proiectată pentru a fi temelia pe care sunt construite aplicațiile .NET.

Biblioteca System conține clase fundamentale și clase de bază care definesc valori frecvent utilizate, evenimente, atribute și procesări de excepții. Alte clase suportă conversii de tip, manipularea parametrilor metodei, invocarea de programe de la distanță și locale, supravegherea de aplicații gestionate și neadministrate.

Biblioteca System.Collections.Generic conține interfețe și clase care definesc colecții generice, care permit utilizatorului să creeze alte colecții specifice aplicației care asigură siguranță și performanță.

Biblioteca System.Data oferă acces la clase care reprezintă arhitectura ADO .NET care permite crearea componentelor ce gestioneză eficient date din surse de date multiple. Într-un scenariu deconectat, cum ar fi internetul, ADO .NET oferă instrumentele necesare pentru solicitarea, actualizarea și reconcilierea datelor din multiple sisteme de nivel.

System.Linq este o bibliotecă care oferă clase și interfețe ce susțin interogări sql(Integrated Query – LINQ). System.Linq este prezentă în ansamblul System.Core. Printre clasele cele mai utilizate amintim: clasa Enumerable(conține operatori standard LINQ care operează pe obiecte ce implementează IEnumerable) și clasa Queryable.

System.Net oferă o interfață de programare simplă pentru multe dintre protocoalele utilizate în rețetelele de azi. Clasele WebRequest și WebResponse formează baza a ceea ce se numesc protocoale conectabile, o punere în aplicare a serviciilor de rețea care permit dezvoltatorilor să creeze aplicații care utilizează resurse de pe internet fără griji cu privire la detaliile specifice ale protocoalelor individuale.

System.Web conține tipuri care permit comunicarea browser/server. Derivate ale acestei librării include tipuri care suportă autentificarea pentru Web Forms, servicii pentru aplicații, caching de date pe server, configurarea aplicației ASP .NET, date dinamice .handlere HTTP, serializare JSON, funcționalități AJAX.

Biblioteca System.Web.Mvc conține clase și interfețe care susțin cadrul ASP.NET Model View Controller pentru creerea de aplicații web. Acestă bibliotecă conține clase ce reprezintă controller-ele, rezultate ale acțiunilor, view-uri, view-uri parțiale, lianți model etc.

Biblioteca System.Web.Security conține clase care sunt utilizate pentru implementarea securității aplicațiilor ASP .NET, în aplicațiile de tip Web server. Printre cele mai cunoscute clase ale acestei biblioteci amintim clasa membership, utilizată pentru a valida acreditările de utilizator și pentru a gestiona setările utilizatorului(parole, adrese de e-mail), clasa Roles care permite gestionarea autorizației pentru grupuri de useri ce au anumite roluri în aplicație.

Cadrul ASP .NET oferă containere la nivel de pagină care pot trece date între controlere și paginile de afișare. Pentru a afișa pagina de view se apelează metoda din controller iar pentru a transmite date paginii de afișare se folosesc proprietatea ViewData din clasa ViewPage. Această proprietate returnează un obiect ViewDataDictionary.

Pe lângă ViewData se pot trimite date spre view și cu ViewBag, PartialView, TempData, ViewModel, Tuple.

Proprietatea ViewBag permite partajarea dinamică a valorilor de la operator spre vizualizare. Este un obiect dynamic ce nu are proprietați predefinite, se gasește în clasa ControllerBase și nu are nevoie de typecasting pentru datatype.

PartialView este utilizat în cazul în care codul(Razor si HTML) necesită o partajare(același cod pentru mai multe view-uri).

TempData este un dicționar de obiecte de tipul TempDataDictionary. Valorile stocate în TempData necesită typecasting la datatype în View. Este similar cu ViewData dar diferența este că TemData permite trimiterea și primirea datelor de la un controller la altul și de la o acțiune a unui controller la altă acțiune.

ViewModel este un model ce permite ca mai multe modele sa fie tratate ca o singură clasă. Acesta nu are mtode proprii ci ar trebuii sa fie o colecție de proprietați necesare unui View.

Logica aplicației este în controller însă utilizatorul nu poate vedea nimic în pagina web. Pentru asta este nevoie de creerea unor fișiere HTML care prezintă informația în browser. În solution explorer aceste fișiere pot fi găsite în folderul de Views. În aplicația prezentată în acestă lucrare fiecărei tabele îi sunt asociate mai multe fișiere de vizualizare grupate într-un folder cu același nume ca și tabela.

În general unei metode din controller îi corespunde un fișier cshtml. Așadar după generarea modelului au fost create fișiere cshtml pentru fiecare metodă din controller(afișare, stergere, editare, creare).

În fiecare view este inclusă declarația modelului în partea de sus a fișierului pentru a putea specifica tipul de obiect pe care view-ul îl așteaptă. De exemplu pentru tabela ContorUtil a fost adăugat următorul include :

@model UtilitiesCalc.Models.Entity.ContorUtil

În continuare fiecărui view îi este precizat numele cu care v-a fi chemat în browser dar și layout-ul. Aplicația prezentată în această lucrare include un singur stil pentru toate fișierele din proiect.

@{

ViewBag.Title = "Edit";

Layout = "~/Views/Shared/_Layout.cshtml";

}

Un exemplu de View este prezentat în figura 12. Controller-ul returnează spre view o listă cu elementele tabelei ContorUtil.

return View(contorUtils.ToList());

Un formular este alcătuit din câmpuri de editare,butoane radio,butoane de comandă etc. Formularele permit construirea unor pagini Web ce permit user-ilor să introducă informații și să le trimită serverului. Informația de la user trece prin două etape până să ajungă la server.

În prima fază utilizatorul completează formularul și apasă butonul de expediere. Faza a doua este reprezentată de aplicația dedicată de pe server care analizează informațiile primate și raspunde în funcție de cerință.

Exemplul de mai jos prezintă structura unui view(view pentru creerea unui nou contor). La început se creează un formular ce afisează cîmpuri de completat pentru user.

@using (Html.BeginForm())

{

@Html.AntiForgeryToken()

<div class="form-horizontal">

<h4>ContorUtil</h4>

<hr />

@Html.ValidationSummary(true, "", new { @class = "text-danger" })

<div class="form-group">

@Html.LabelFor(model => model.cod_ap, htmlAttributes: new { @class = "control-label col-md-2" })

<div class="col-md-10">

@Html.EditorFor(model => model.cod_ap, new { htmlAttributes = new { @class = "form-control" } })

@Html.ValidationMessageFor(model => model.cod_ap, "", new { @class = "text-danger" })

</div>

</div>

<div class="form-group">

@Html.LabelFor(model => model.ContorApa, htmlAttributes: new { @class = "control-label col-md-2" })

<div class="col-md-10">

@Html.EditorFor(model => model.ContorApa, new { htmlAttributes = new { @class = "form-control" } })

@Html.ValidationMessageFor(model => model.ContorApa, "", new { @class = "text-danger" })

</div>

</div>

<div class="form-group">

<div class="col-md-offset-2 col-md-10">

<input type="submit" value="Create" class="btn btn-default" />

</div>

</div>

</div>

}

Se remarcă stilul inline prezent în acest view: <div class="form-group">, <div class="col-md-10"> .

Eticheta <div> funcționează asemănător cu eticheta <p>, marcând un întreg bloc de conținut, dar fără a genera linii albe între paragrafe.

În figura următoare este prezentat rezultatul codului prezentat anterior.

Manual de utilizare al aplicației

Platforma online de monitorizare și control a costurilor unitaților domestice este o aplicație de tip pagină web ce permite accesul a două grupuri de useri: consumatorii normali și administratorul blocului.

Interfața aplicației este una comună majoritații paginilor web constând din pagina de Home, About, Contact, Maintenance, Register și pagina de LogIn.

Pagina de Home conține o scurtă prezentare a platformei și sloganul platformei.

Pagina de contact conține informații despre creatorul platformei. Pagina de About conține o prezentare mai amănunțită a platformei (este explicat conceptual AMR).

În momentul în care un utilizator nou (deasemenea locatar al blocului) intră pe site acesta trebuie să se înregistreze. El se poate loga pe site doar dacă s-a înregistrat în prealabil. La înregistrare acesta este nevoit să completeze câmpurile de User Name, User Password, User E-mail și codul apartamentului. Dacă aceste câmpuri nu sunt completate v-a apărea un mesaj de eroare.

În urma unei înregistrari reușite se v-a afișa un mesaj de înregistrare cu succes. După caz la conectarea pe site vor apărea panourile de control(pentru user normal sau pentru administrator).

Pagina de Maintenance este o pagină dedicată locatarilor blocului pentru anumite sugestii și reclamații. Lăsarea unui ticket este foarte simplă, user-ul trebuie să identifice problema și să completeze formularul ce apare la apăsarea butonului de Submit. Aceste reclamații și sugestii vor putea fi vizualizate de către administrator din panoul său de comandă. De asemenea pe măsura rezolvării lor aceste mesaje pot fi șterse de către administrator.

La conectarea pe site un user normal poate executa următoarele acțiuni: editarea contului curent, afișarea totalului de plată pentru luna respectivă, afișarea istoricului, afișarea prețurilor la utilitați.

Pentru a proba funcționalitatea aplicației am folosit un user de test: Roxana. Pentru acest user am afișat totalul de plată pentru luna curentă, istoricul și afișarea prețurilor.

Figure 17 : Plata pentru luna curentă pentru user

Figure 18 : Istoric plați

Figure 19 : Tabela de prețuri pentru utilitați

La conectarea administratorului pe site în panoul de comandă acesta poate efectua următoarele acțiuni: modificarea prețurilor la utilitați, editarea tabelei de useri, modificarea unui index în cazul unui contor defect, vizualizarea sugestiilor și reclamațiilor, citirea datelor de la contoare, calculul plații pentru luna curentă și totalul de plată pentru toate lunile în cazul în care se necesită o recalculare.

Figure 20 : Panoul de comandă al administratorului

Figure 21 : Modificarea prețurilor

Citirea indexilor pentru utilitați se face de catre admin. Fișierul cu datele de la contoare va fi încărcat pe site iar la apăsarea butonului de OK datele vor fi scrise în baza de date, în tabela de IndexUtil.

Figure 22 : Citirea datelor de la contoare

După calcularea prețurilor indiferent dacă doar pentru o lună sau pentru toate lunile până la data curentă administratorului îi este afișată lista cu totalul de plată pentru fiecare user pentru toate lunile.

Figure 23 : După calcularea prețului se afișează totalul de plată

Referințe bibliografice

https://www.asp.net/

http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html

http://en.wikipedia.org

http://stackoverflow.com/

http://www.codeproject.com/

http://www.codecademy.com/

http://www.c-sharpcorner.com/

Welcome

https://msdn.microsoft.com

History of Automated Meter Reading (AMR)

http://www.slideshare.net

http://www.sari-energy.org/PageFiles/What_We_Do/activities/Afghan_Capacity_Building_Program_Aug_09/Metering_Systems_and_Management_Sep_2010/Presentations/English/Introduction_to_AMR_RMR_%20280910.pdf

http://www.usclcorp.com/news/Automatic_Power_Reading.pdf

http://www.worldit.info/articole/introducere-in-design-patterns-mvc-partea-i/

http://www.w3schools.com/

Referințe bibliografice

https://www.asp.net/

http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html

http://en.wikipedia.org

http://stackoverflow.com/

http://www.codeproject.com/

http://www.codecademy.com/

http://www.c-sharpcorner.com/

Welcome

https://msdn.microsoft.com

History of Automated Meter Reading (AMR)

http://www.slideshare.net

http://www.sari-energy.org/PageFiles/What_We_Do/activities/Afghan_Capacity_Building_Program_Aug_09/Metering_Systems_and_Management_Sep_2010/Presentations/English/Introduction_to_AMR_RMR_%20280910.pdf

http://www.usclcorp.com/news/Automatic_Power_Reading.pdf

http://www.worldit.info/articole/introducere-in-design-patterns-mvc-partea-i/

http://www.w3schools.com/

Similar Posts