Masini Virtuale In Azure Preview Portal

1.Microsoft Azure

1.1Solutii de calcul de tip cloud

Utilizând un centru de date on-premises totul va trebui manipulat și gestionat , inclusiv achiziționarea și instalarea de hardware, virtualizarea, instalarea sistemelor de operare și orice alte aplicații necesare bunei funcționari, configurarea rețelei , configurarea firewall-ului și a securitatii , implementarea modalitaților de stocarea de date .Dupa fixarea acestor elemente fundamentale, o mare responsabilitate este preluata de mențirea ciclului de viață al acestora spre a se indeplini criteriul optim de performanță.
Toate aceste elemente presupun o invenstiție de capital semnificativă atât pentru partea hardware și software cat și costuri semnificative de întreținere. Utilizatorului i se oferă posibilitate de alege elementele software și hardware pe care și le doreste insă orice element reprezintă o investiție pentru care se plateste indiferent de importanța utilitații sale ori dacă este intradevar un element indispensabil sau nu.

Cloud computing este o metoda modernă ce vine ca o soluție alternativa unui datacenter on-premis. Un vendor cloud este complet responsabil de strctura hardware și mentenanță. Acesta ofera o platformă complexă de servicii dintre care utilizatorul poate alege în conformitate cu nevoile sale. Simplificat cloud computing se poate explica ca fiind concentrarea puterii de calcul, spațiului de stocare și a software-ului intr-o retea complexa și imensă de severe unde utilizatorilor li se poate oferii accesul sub forma de serivicii cu ajutorul accesării web.

Avantajele cloud-computing-ului sunt semnificative. Printre cele mai importante putem enumera avnatajul puterii de calcul mare, capacitate de stocare mare, siguranța datelor, mobilitatea, costuri mult mai practice, diminuate seminificativ în funcție de nevoi.

Ca rezolvare a acestei situații vine tehnologia cloud computing . Toate aceste cereri și elemente fundamentale se vor livra sub formă de servicii. Cu alte cuvinte, o companie IT care deține resurse hardware/software/infrastructura pun la dispoziție companiilor o parte din aceste resurse ca servicii.Singurul lucru de care vor trebui să fie capabile calculatoarele este să suporte o conexiune la internet și lucrul cu un browser.
Cloud computing oferă o alternativă modernă tradiționalului datacenter on-premises. Un vendor cloud este complet responsabil pentru infrastructura ,mentenanță aplicații sau storage și ofera o gama variata de servicii de tip platform ce pot fi folosite. Desi utilizatorul pare limitat la partea hardware oferită de vendorul cloud , acesta are beneficiul de a plăti numai când o folosește .

Mediile cloud ofera de obicei experiența folosiri unui portal online facilitându-le astfel utilizatorilor accesul catre gestionarea resurelor de calcul stocate, de retea sau de aplicații. De exemplu un utilizator poate folosii portalul pentru a configura o mașină virtuala(VM) specificând urmatoarele: puterea nodului de calcul ( CPU, RAM, discuri locale) , sistemul de operare, software-uri dorite, configurarea rețelei, și locația nodului. Utilizatrul poate implementa aceată mașină virtuală și in cateva minute poate avea acces catre ea.

Adițional public cloud-ului, exită private cloud și hybrid cloud. Intr-un mediu cloud privat se construiește o infrastructură It propie.

Ca exemplu se poate lua modelul unei firme cu un număr x de angajați. Fiecare angajat are propriul său calculator cu monitor, unitate centrală și tastatura. Deja acest lucru reprezintă o investiție majora. Fiecare calculator are instalate pe el mai multe programe, fiecare cu propria licență. Chiar și sistemul de operare trebuie licențiat. Costurile pentru licențe sunt extrem de mari, acestora li se adaugă costurile de mentenanță. Investițiile hardware sunt iar un factor de cost ridicat intr-o companie unde nivelul de date stocate este ridicat.

Prin intermediul principiilor private cloud în loc să existe în firmă multe unitați centrale, va exista doar una cu putere de calcul mai mare, care va prelua sarcinile tuturor calculatoarelor. Aceasta unitate va avea instalate aplicațiile necesare desfășurării activitaților ce vor fi distribuite pe toate calculatoarele.

O infrastructură cloud hybrid integrează atat public cat și private cloud. De exemplu un web site poate fi gazduit intr-un cloud public și legat de baza de date cu un grad ridcat de securitate intr-un mediu on-premises.

1.2 Diferențele intre Azure si On-premises

Cu o infrastructură on-premises, se deține controlul complet asuprea elementelor de tip software și hardware ce sunt implementate. Pana acum acest lucru a dus la o generalizare a deciziei de achiziție hardware având ca principal criteriu ideea de extindere. Spre exemplu decizia achizitionării unui server cu mai multe nuclee pentru satisfacere o posibilă nevoie de performanță în viitorul apropiat. Prin Azure se pot implementa soluții hardware doar oferite de Microsoft. Astfel se ia în considerare beneficiul scalabilitățtii infrastructurii progresiv în functie de nevoile ce pot fi întampinate pe parcurs.Deșii acest lucru are consecințe asupra arhitecturii sistemului, există o dovada certă a cost eficacității utilizării acetei metode de implementare.

Microsoft a implementat centre de date Azure în 19 regiuni din intreaga lume pornind de la Melbourne la Amsterdam și Sao Paulo la Singapore. În plus Microsoft detine unacord de parteneriat cu Via21Net făcând utlizarea Azure posibilă în doua regiuni din China. Numai cele mai mari intreprinderi globale sunt în masură să implementeze centre de date în această maniera , asadar utiliarea Azure faciliteaza implementa serviciile cat mai aproape de client oriunde acesta s-ar afla în lume.

Pentru inceput Azure ofera posibilitatea unui cost extrem de scăzut și facilitează scalabilitatea. Azure oferă flexibilitatea de configure cat mai usoră și de testare a configurațiilor noi pentru ca mai apoi acestea să fie readuse la forma inițiala cu un cost extrem de scazut și mentenanță inexistentă.

De asemenea un alt avantaj este acela că utilizatorul poate testa versiunile noi de software apărute fara a fi nevoit să facă upgrade echipamentului on-premises. Cu alte cuvinte dacă utilizatorul dorește să studieze ramificațiile unei aplicații asupra Microsoft SQL Server 2014 în loc de Microsoft SQL Server 2012, o poate face cu usurință fară alocarea unor noi componente hardware. De asemenea utilizatorul poate rula o mașină vrtuala cu Microsoft Windows server 2012 R2 în loc de Microsoft Server 2008 R2.

1.3 Categorii de servicii Cloud

Mediul Cloud este clasificat în trei categorii: SaaS, Paas și Iaas. Avănd în vedere viteza de evoluție a acestei tehnologii, diferențele intre ramurile sale devin din ce în ce mai nesemnificative.

1.3.1 SaaS: Software as a Service

SaaS este un software găzduit pentru utilizatorul client. Arhitectura sa este de tip multi-tenant: o singuraversiune a aplicație este folosită de catre toți clienții. Poate fi scalată către multiple instațe pentru a se asigura performanța dorită. Costurile folosirii unui software Saas implicăîn general cumpararea unei licențe lunare sau a unui abonament annual.

Office 365 este un model prototip al serviciilor de tip Saas. Utilizatorii plătesc o taxa de abonament lunară sau anuală, în schimbul careia primesc Exchange as a Service(Outlook), Storage as a Service( OneDrive), și restul pachetului Microsoft Office(online, versiunea desktop sau ambele). Abonați au întotdeauna acces catre ultima versiune a aplicațiilor. În mod esențial acest factor permite folosirea serverului Microsoft Exchange fara a fi nevoie de cumpărarea serverului, instalarea sa ori costuri pentru support și mentenanță. Serverul de Exchange este intretinut și menținut pentru a intâlnii nevoile clientului asta incluzănd chiar și pachete software ori update-uri. Comparând cu versiunea on-premises unde utilizatorul este nevoit să upgradeze pachetul Office în fiecare an, aceasta opțiune este mult mai simplă scutindu-se astfel costuri semnificative.

Alte exemple de SaaS include Microsoft One Drive, Dropbox, WordPress sau Amazon Kindle.

1.3.2 PaaS: Platform as a Service

Folosind PaaS: Aplicația poate fi lansata cu ajutorul unui mediu de hosting oferit de un vendor cloud. Dezvoltatorul oferă aplicația, în imp ce vendorul PaaS oferă posibilitatea de rulare a acesteia. Acest lucru usurează considerabil munca depusă de dezvoltatori fluidizând astfel intrega procedura. Programatorul nu mai este responsabil de achizioținarea și managementul intregi infrastructuri , astfel atenția sa este indreptata exclusiv catre dezvoltare.

Azure ofera multiple posibilitați de utilizare cum ar fi Azure Websites sau Azure Cloud Storage services. în orice caz, programatorilor li se ofera posibilitați multiple de a-si incarca aplicația intr-un mediu cloud fara a avea nevoie să detina cunostinte legate incepand de la cabluri la piese hardware. Dezvoltatorii de aplicatii nu sunt nevoiți să isi creeze VM-uri ,să foloseasca Remote Desktop pentru a se logape fiecare în parte și să instaleze aplicația. Trebuie doar să apese cateva butoane și tool-urile Microsoft preiau sarcina de provizionare a mașinilor virtuale iar apoi acesta trebuie sa urce aplicația și să o instaleze.

Pentru a scala un seviciu Azure, nu trebuie depus nici-un fel de efort. Este extreme de facil. Tot ce trebuie să facă utilizatorul este să folosească opțiunea de republicare în timp ce Azure face toata munca automat de la update la configurarea intregii rețele.

1.3.3 Iaas: Infrastructure as a Service

Un vendor cloud IaaS manageriaza o ferma de servere , oferind posibilitatea utilizatorului de a crea masini virtuale și a le rula folosind infrastrctura integral a vendorului. în functie de vendor se pot crea masini virtuale ce ruleaza Windows sau Linux putandu-se instala pe ele orice în functie de preferinte. Azure asigura de asemenea posibilitatea de a seta retele virtuale, procese de load balancing , sau storage-uri pe langa multiple alte servicii. Utilizatorul nu are insa controlul asupra hardware-ului sau virtualizarii software-urilor, dar are controlul asupra tuturor celorlalte aspect. Spre deosebire de PaaS, aici utilizatorul este responsabil de aceste aspecte.

Azure Virtual Macine, oferta IaaS a Azure, este o alegere populara când vine vorba de migrarea serviciilor în Azure deoarece se bazeaza pe modelul “ lift and shift “. Acest model presupune configurarea unui mediu asemanator și transpunerea aplicatiei pe acesta. Spre exemplu se poate configure o mașină virtuală similara infrasructuriice ruleaza datele local și migrarea software-ului pe aceasta mașină virtuala. Sunt nevoie cateva schimbari de configurare cum ar fi URL-uri catre servicii și storage-uri dar acesete configurari nu prezinta nici-un un impediment fiind de ordin minor.

1.3.4 Serviciile Azure:

Azure include multe servicii în platforma sa de cloud computing. Dintre ele pot fi mentioate urmatoarele :

Servicii de calcul : Acestea includ Microsoft Azure Clod Service, Azure Virtual Machine, Azure websites și Azure Mobile Services.

Servicii de date : Acestea include Microsoft Azure Storage(blob, queue table și servicii Azure Files ) Azure Sql Database, și Redis Cache.

Servicii pentru aplicații: Acestea include servicii ce permit utilizatorului să construiască și să opereze aplicații folosind Azure Active Directory, Service Bus pentru conectarea sistemelor distribuite, HDIsight pentru procesarea datelor, Azure Scheduler și Azure Media Services.

Servicii de rețea: Acestea include Virtual Networks, Azure Content Delvery Network, și Azure Traffic Manager.

Cand o aplicație este migrată către mediul cloud, trebuie să se cunoască aspecte ale serviciilor disponibile în Azure, pentru ca procesul de migrarea să fie cat mai simplicat și robust

1.4 Introducere catre Portal:

Un portal online oferă cea mai usoara posibilitate de manageriere a resurselor. Aceata se poate folosi pentru creearea mașinilor virtualcturiice ruleaza datele local și migrarea software-ului pe aceasta mașină virtuala. Sunt nevoie cateva schimbari de configurare cum ar fi URL-uri catre servicii și storage-uri dar acesete configurari nu prezinta nici-un un impediment fiind de ordin minor.

1.3.4 Serviciile Azure:

Azure include multe servicii în platforma sa de cloud computing. Dintre ele pot fi mentioate urmatoarele :

Servicii de calcul : Acestea includ Microsoft Azure Clod Service, Azure Virtual Machine, Azure websites și Azure Mobile Services.

Servicii de date : Acestea include Microsoft Azure Storage(blob, queue table și servicii Azure Files ) Azure Sql Database, și Redis Cache.

Servicii pentru aplicații: Acestea include servicii ce permit utilizatorului să construiască și să opereze aplicații folosind Azure Active Directory, Service Bus pentru conectarea sistemelor distribuite, HDIsight pentru procesarea datelor, Azure Scheduler și Azure Media Services.

Servicii de rețea: Acestea include Virtual Networks, Azure Content Delvery Network, și Azure Traffic Manager.

Cand o aplicație este migrată către mediul cloud, trebuie să se cunoască aspecte ale serviciilor disponibile în Azure, pentru ca procesul de migrarea să fie cat mai simplicat și robust

1.4 Introducere catre Portal:

Un portal online oferă cea mai usoara posibilitate de manageriere a resurselor. Aceata se poate folosi pentru creearea mașinilor virtuale, folosirea serviciilor cloud, setarea mașinilor virtuale, setarea storage-ului, website-uri și multe altele. La momentul actual exista doua versiuni de portal. Unul este Azure Management Portal iar celalalt Azure Preview Portal.

Cele doua portal-uri au modalitati de abordare și navigare diferite.Azure Preview Portal este incă în etapa de imbunătățire și de aceea nu poate comonentele au fost incă migrate.De exemplu scararea uui website Azure ofera doar o parte din opțiunile de pe vechea platforma, dar Redis Cache este disponibil doar pe versiunea noua.

Portalul curent ofera posibilitatea folosirii mai multor resurse în același timp.

1.5 Azure Preview Portal:

În partea stangă se afla butoanele pentru home, notifications, browse, active și billing. Partea centrală a ferestrei se numește Startboard. Aceasta poate fi personalizată în functie de preferințe.

In partea din stangă avem:

Home: pagină principală- Startboard

NOTIFICATIONS: va afișa alertele și notificările din ultimele 24 de ore precum și înștiințări că mașină virtuală a fost creata.

BROWSE: facilitează operarea prin filtre de căutare.

ACTIVE: va afișa structurile active

BILING : informații despre costuri și plăți.

Feresterele de afișare navigănd din Virtual Machines prin path-ul Browse> Browse Everything> Virtual Machines se numesc blade-uri

Daca utilizatorul dă click pe ralucaApp o altă ferestra se va deschide către dreapta și va afișa propietațile mașinii virtuale selectate .

În ascest moment dacă se selecteaza butonul de Setting un alt blade se deschide afisând un intreg sir de selecții. Acesta poarta numele de journey.

Dacă utilizatorul se intoarce dând click pe Browse și selectează Virtual Networks, jorney-ul către VM Setting este închis iar un alt blade este afișat. Dacă se selectează un virtual network, atunci un alt journey este disponibil.

Dacă utilizatorul selectează butonul Active atunci ambele journey-uri sunt afișate.

Aceste journey-uri pot fi curațate din lista de Active folosind butonul de inchidere.

1.5.1 Personalizarea Startboard-ului

Când se crează noi resurse, opțiunea de Add to Startboard devine active. Dacă această opțiune este selectată se va crea un shortcut pe Starboard pentru noile resurse dorite.

1.6 Azure Management Portal

Pagina principală a platformei afisează informații despre serviciile utilizate.

In partea dreaptă există o listă de resurse disponibile.

Această listă facilitează accesul catre o anumita resursă. De exemplu dacă utilizatorul doreste să accese o mașină virtuală creată, allege Virtual Machines. dacă va da click pe una din mașinile create deja, va fi condus catre Dashboard.

Meniul de navigare al mașini virtuale este format din: Dashboard, Monitor, Endpoints și Configure. Exista un sumar al performanțelor mașinii virtuale și detalii variate cum ar fi DNS-ul.

Opțiunile meniului și Dashboard-ul se schimbă în funcție de tipul de resursă, iar conținutul meniului deasemenea se bazează pe acesta.

În josul paginii dacă dăm click pe una din masinile virtuale create, o bară de comenzi va fi afisată.

Această bară de comenzi se schimba de asemenea în funcție de tipul de resurse folosit.

1.7 Azure virtual machines

Platform-as-a-Service este fara dubiu o obțiune extrem de atractivă pentru anumite categorii de workloads. Cu toate acestea nu orice soluție se potrivește cu modelul oferit de un serviciu.

Unele sisteme necesită un control total asupra infrastructurii cum ar fi configurări ale sistemului de operare sau necesitatea de a instala și configura software-uri server traditionale. în aceste cazuri intervine IaaS Infrastructure-as-a-Service ca soluție Azure.

1.7.1 Ce este o mașină virtuală Azure?

O mașină vituală este una din elementele principale ale domeniului de posilități oferite de Azure IaaS. Impreună cu Virtual Networks, Azure Virtual Machies suportă implemntarea mașinilor virtuale de tip Windows Server sau Linux în Microsoft Azure datacenter. Astfel utilizatorul deține controlul total asupra tuturor configurărilor mașinii virtuale folosite. Acesta este responsabil de instalarea software-urilor dorite, configurărilor, și a mentenanței acestora.

Datorită nivelului de control , o serie de infrastructuri nu se potrivesc cu modelul PaaS cum ar fi servere database ca SQL Server , Oracle, MongoDb. Windows Server Actove Directorz, SharePoint au devenit posibil de utilzat în intregime pe platforma Microsoft Azure.Dacă iși doresc userii pot muta aceste infrastructuri on-premises pe platforma Azure proces ce se numește “ridică și livrează”.

Mașinile virtuale Azure pot avea 3 stari posibile:

-running : mașină ruleaza normal

-stopped : mașină virtuală este oprită dar incă consumă resure

-stopped(deallocated) – mașină este oprită și nu consumă resurse

By default, oprind o mașină virtuală în Azure Management Portal pune mașină în faza Stopped (deallocated) . dacă utilizatorul doreste să oprească mașină virtuală dar aceasta să fie incă alimetată de resurse atunci va trebui utilizată o comandă în PowerShell:

> Stop-AzureVM -Name "az-essential" -ServiceName "az-essential" –StayProvisioned

1.7.2 Adresa IP

Adresa vrtuala publica IP (VIP) aparține serviciului cloud, nu mașinii virtuale. Fiecare mașină virtuală are propiul ei Ip direct. Atat timp cât una sau mai multe mașini virtuale rulează sau suntîn modul Stopped, VIP este alocat. Dacă utilizatorul dorește să oprească instanța mașinii virtuale dar totusi să rezerve adresa VIP acesta nu trebuie să folosească opriunea de dealocare a mașinii virtuale.

1.7.3 Crearea și configurarea masinilor virtuale

Exista doua tipuri de mașini virtuale , Basic și Standard. Cele basic sunt acele mașini virtuale ce nu au nevoie de load balancing sau de o viitoare scalare. Cele standard asigură toate configurările și utilitareele suportate de Azure Virtual Machines.

Inafară de versiunile Basic și Standad exista o multitudine de alte specificati din care utilizatorul poate alege pentru crearea mașinii virtuale potrivite în funcție de nevoile sau cerințele sale. Exista mașini virtuale de marimi diferite cum ar fi seria A unde acestea sunt de o capacitate tradiționala, cele din seria D ce dețin procesoare mai puternice, o ratțe memorie-core mai ridicata și un SSD puternic.

Atunci când utilizatorul crează o mașină virtuală obține doua disk-uri . Un disk OS ce persistă în Azure blob storage și un disk temporar. Disk-ul temporar are ca locație fizică structura serverului . Acest disk temporar folosește tradiționalul HDD pentru serile A și SSD pentru seriile D.

1.7.4 Cum se crează o mașină virtuală în Azure Preview Portal

După ce utilizatoru se loghează în plantforma portalului acesta va fi nevoit să deschidă blade-ul de crearea al mașinii viruale din meniul principal. Dupa apăsarea butonului de creare utilizatorul va completa cofigurațiile mașinii virtuale.

Crearea unei mașini virtuale este doar inceputul. Există o serie de alți factori importanți care trebuie luați în considerare cum ar fi scalabilitatea, SLA, disk management ,mentenanță și multe altele extrem de importante.

1.8 Azure storage:

Microsoft Azure Storage este un serviciu microsoft ce oferă un storage durabil, scalabil și redutant. Microsoft este răspunzător pentru backup-uri și mentenanța. Sub o subscripție Azure utilizatorul poate deține 50 de conturi pentru storage, fiecare având o capacitate de 500TB.

Azure oferă numeroase servicii în acest domeniu: Blob services , File Share Service, Table Service, și Queue service. Deasemenea metrice de monitorizare pot fi pornite.

Acronimul de BLOB vine de la Binary Large Object. Blob-urile sunt practic fișiere ce sunt stocate pe coputer. Acestea pot fi fotografii, fisere Microsoft Excel, fisiere HTML și asa mai departe.

Azure BLOB service ofera utilizatorului posibilitatea de a stoca fisiere și de ale accesa de oriunde. Pentru a folosi un serviciu BLOB, este necesarea crearea unui cont de storage .O dată ce contul a fost creat se vor crea containere similare folderelor iar blob-urile pot fi copiate aici.

Utilizatoru poate crea oricat de multe conteinare doreste insa nu poate crea un container în alt container

Azure Storage suportă doua tipui de blob-uri: blob blocks și blob page. Blob blocks sunt folosite pentru a stocaa fișiere obișnuite de pana la 200 de gb fiecare. Principalele blob-uri de acest tip sunt acelea ale căror date vor fi parcurse de la inceput până la sfârșit cum ar fi fișierele media. Se numesc Blocks blobs deoarece fișiere mai mari de 64 de mb trebuie să fie uploadate în bloburi mai mici ce apoi sunt consolidate în blob-ul final . Page blob sunt folosite pentru a ține fișiere de tip random-access de pană la 1 TB. Se numesc page blob deoarece oferă acces random read/write la pagini de 512 byte. Acestea sunt folosite în principal pentru backing storage VHD folosit pentru a oferii disk-uri durabile în Azure virtual machine , Iass.

Azure Files service oferă posbilitatea utilizatorului de a seta rețele de schimburi de fișiere cu dimensiuni mari folosind protocolul standard Server Message Block (SMB) . Asta inseamnă că multiple masini virtuale pot impartii aceleasi fisiere pe care le pot citii și accesa.

Serviciul Azure Siles poate fi folosit în multe cazuri. De exmplu atunci când mai multe amplicatii on-premises au nevoie de fișiere comune, e mult mai usor ca aceste fisiere să fie migrate în Azure.Deasemenea fișierele de configurare pot fi tocate și apoi accesate de diferite masini virtuale, sau loguri de diagnostic, metrice, crash dumps, pot fi salvate și procesate mai târziu pe un storage. Tool-uri sau utilitare folosite de mai mulți programatori pot fi stocate pe un storage , astfel toti vor folosii aceleasi versiuni de programe ce vor fi disponibile pentru fiecare dintre ei .

Table Storage este un data store NoSql scalabil care permita stocarea unor dimensiuni de date imense semstructurate, nonrelational. Nu permite folosirea join-urilor complexe, folosirea cheilor străine, sau executarea uneor proceduri. Fiecare tabel are un singur index care poate fi folosit pentru o accesare usoară.Un uz comun al acestor table storage-uri este pentru log-urile de diagnostic.

Pentru folosirea unui table storage este necesara crearea unui cont de storage, Entitațile unui table storage conțin o serie de chei/valori în pereche. Fiecare entitate are trei propietați de sistem : o cheie de partiționare, o cheie pentru rand, și un timestamp. Cheile de partitionare și de rând trebuie să fie unice, impreună formând primary key-ul tabelului.

Queue service

Queue service este un serviciu folosit pentru stocarea mesajelor.

Mesajele Queue pot avea pana la 64 Kb, iar un queue poate conține milioane de mesaje până la dimensiunea maxima admisa.

Queue sunt folosite în general pentru a crea o listă de mesaje procesate în mod asincron. Acest serviciu este de tip FIFO . Deexemplu este posibil ca în cadrul unei companii un angajat să detină un job în cadrul căruia trebuie să vefice în mod constant mesajele primite. În momentul în care gaseste un mesaj, il proceseaza și apoi il sterge din Queue.

Reduntanța

Daca unul din noduri va inceta să funcționeze atunci există mai multe tipuri de proceduri , numite proceduri de „reaplication”:

-LRS- Locally Redudant Storage: vor fi create 3 copii inainte ca o scriere să aibă loc.

Asta inseamnă că datele vor fi disponibile chiar dacă va exista o situație de criză. Când are loc o cerere catre storage, Azure trimite cereri catre toate cele 3 copii și așteaptă un raspuns pozitiv din partea lor inainte ca acestasă raspunda utilizatorlui.

-GRS- Geo- Redudant Storage: GRS genereaza trei copii LRS ale datelor în prima regiune, apoi generează în mod asincron trei copii LRS în regiunea de recuperare a dezastrelor.

1.8.1 Cum se crează un Storage ?

Dupa ce utilizatroul parcurge procesul de autentificare în cadrul platformei Azure, va accesa butonul New din colțul stâng iar apoi va alege oțiunea de storage.

In primul rând utilizatorul va fi nevoit să isi aleagă un nume pentru storage-ul creat, precum și alte detalii in funcție de nevoile și cerințele sale.

1.9 Cum se creaza o aplicație ASP.NET în Azure ?

După ce utilizatorul va deschide Visual studio 2013 sau Visual Studio 2013 Express for Web , va alege din fereastra New project opțiunea  ASP.NET Web Application

În secțiunea New ASP.NET Project utilizatorul va selecta MVC template.

Petru a se putea efectua sicornizarea cu Azure utilizatorul va trebui să seteze tipul aplicației ca fiind Web App și să bifeze opțiunea de host în cloud.

Pentru ca sincronizarea intre platforma azure și Visual studio să aiba loc, utilizatorul va trebui să introducă datele de autentificare Azure în cadrul Visual Sudio . Va trebui să aleagă un Web App name.

2.0 Tehnologiile folosite

2.1 C#

Numele C# se consideră a fi inspirat din muzica datorită notației #, notatie ce în domeniul muzical inseamnă că nota precedentă este cu un semiton mai înaltă. Această similititudine se poate observa și asupra limbajului C++ unde ++ poate înseamna că limbajul C++ este cu ceva mai mult față de limbajul C.C# a fost inventat în cadrul companiei Microsoft, creatorii lui find Anders Hejlsberg, Scott WIltamuth și Peter Golde. O primă implementare a acestui limbaj a fost lansatăca parte a initiative .Net în iulie 2000 de catre Microsoft.Acest moment a reprezentat n punct de evoluție majoră, multi dintre programatorii de c++, C sau java migrănd cu usurință către C#, datorită asemanarii dintre aceste limbaje dar în principal datorită calității acestui nou limbaj.Limbajul C# a devenit astfel unul dintre cele mai utilizate limbaje din lume.

Limbajul C# conține un număr important de facilități inovatoare, cele mai importante

referindu-se la suportul încorporat pentru componente software. C# deține facilități ce

implementează direct elementele carealcătuiesc componentele software, din care putem menționa proprietațile, metodele și evenimentele. Una din cele mai importante facilitațipe care C# le deține este posibilitatea de a lucra intr-un mediu cu limbaj mixt.

Creatorii limbajului C# au dorit să personalizeze limbajul cu mai multe facilități:

Un limbaj simplu și modern cu un nivel de productivitate ridicat în programare;

C# este un limbaj orientat pe obiecte;

Aplicații durabile,robuste;

Orientat obiect dar și orintat spre component;

Sintactic C# se considera că deriva din C# insă include și alte influențe cum ar fi Java. C# este un limbaj folosit chiar șipentru sisteme dedicate. Acestea se întind pe o arie largă, începând cu dispositive portabile, mp3 playere, telefoane și până la dispositive cum ar fi semafoarele.

2.2 Relatia dintre C# și arhitectura .NET

.Net este o schimbare majoră în ceeace privește tehnologia. Ca o comparație a evoluției în ceea ce privește programarea se poate menționa că la fel cum calculatoarele au migrat de la DOS la WINDOWS așa lumea calculatoarelor și a programări a migrat către .NET.

Această tehnologie a fost introdusă de Microsoft cu scopul de a concura împotriva limbajului Java și a fimei Sun. Din cauza faptului că lumea depinde de internet din ce în ce mai mult iar Java deținea monopolul când venea vorba de o aplicație web, Microsoft s-a ambiționatsă nu piardă bătălia. Deșii .NET a împrumutat o parte majoră din ideile sale de la J2EE , și-a depășit totuși competitorii în mod considerabil.

.NET Framework are o biblioteca cu o clasa singulară, iar asta îi multumește pe programatori deoarece este tot ceea ce aceștia trebuiesă invețe. Chiar dacă ei scriu codul în C# sau VB.Net se folosește clasa .NET și nu exista o altă clasa specifcă unui alt limbaj de programare.

Datorită faptului ca C# este un limbaj de programare curat are o legaturăstransă cu arhitectura .NET. C# a fost creat pentru dezvoltarea codului necesar arhitecturii .NET, iar pe de altăparte bibliotecile utilizate de C# sunt cele ale arhitecturii .NET.

Ce este arhitectura .NET ?

Arhitectura .NET ofera sistemelor microsoft un mediu de programare și execuție a aplicațiilor.

Arhitectura .NET presupune un mediu de programare ce permite dezvoltarea și

execuția aplicațiilor indiferent de platforma. Este permisă programarea în limbaj mixt

oferindu-se facilitați de securitate și portabilitate programelor. Este disponibilă deocamdată

pentru platformele Windows.

In legatura sacu C#, arhitectura .NET deosebește doua entități importante , biblioteca

de clase .NET și motorul comun de programare sau Common Language Runtime (CLR).

C# nu deține o biblioteca de clase propie ci utilizeazăspre multumirea programatorilor ,direct biblioteca de clase .NET.

Common Language Runtime (CLR) se ocupă de execuția programelor C#. El se

asigurăcă programarea este realizată în limbaj mixt, precum și de securitatea și portabilitatea programelor.

Când un program C# este compilat , sau un program în limbaj mixt, rezultatul

compilării nu este un cod executabil. în urma executării se genereaza un fișier al cărui conținuteste de tip de pseudocod numit limbaj intermediar sau IL (Intermediate Language).

Fișierul IL poate fi copiat în orice calculator care dispune de .NET CLR. Cu ajutorul unui

compilator numit JIT (Just în Time), motorul comun de programare va transforma codul

intermediar în cod executabil. Acest proces de conversie decurge astfel: când un

program .NET este executat, CLR va activa compilatorul JIT. Compilatorul JIT va converti

IL în cod executabil.Astefel , orice program compilat pana în format IL poate rula în orice mediu pentru care CLR este implementat. Astfel arhitectura .NET asigură portabilitatea.

2.4 Principiile programarii orientate obiect

Metodologiile de programare se modifică în mod continuu de la apariția calculatoarelor

pentru a ține pasul cu marirea complexității programelor. Primele calculatoare utilizau

programarea introducând instrucțiunile mașină scrise în binary Cu cât

programele au crescut s-a inventat limbajul de asamblare, ce permitea gestionarea

programelor mai mari prin utilizarea unor reprezentari simbolice ale instructiunilor mașină.

Deoarece programele continuausă crească, s-au introdus limbaje de nivel inalt, Cum ar fi

FORTRAN și COBOL, iar apoi programarea structurată a fost inventată.

POO a preluat ideile cele mai bune de la programarea structurată, combinandu-le cu

conceptele noi aparute. Astel a fost generată o modlitate diferita de a organiza un program. Practic, un program poate fi organizat în doua modalități: în jurul codului (mod de lucru descris de sintagma “codul acționeaza asupra datelor”, plauzibil și în cazul programarii structurate) sau în jurul datelor (abordare descrisă de sintagma “datele controlează accesul la cod”, valabilă în cazul programării orientate obiect).

Toate limbajele POO presupun patru caracteristici comune: încapsularea, polimorfismul,

moștenirea și reutilizarea.

Încapsularea

Încapsularea este un mecanism de combinare a datelor și metodelor intr-o structură de date singulară, definind deasemenea și modul în care obiectul precum și restul programului pot referi datele din obiect.

Încapsularea este denumită și realizarea de cutii negre, deoarece se ascunde

funcționalitatea proceselor. În momentul în care codul și datele sunt incapsulate un obiect este creat . În cadrul unui obiect, codul și datele pot fi private sau publice. Dacă codul și datele sunt private se presupune că acestea sunt accesibile doar în cadrul aceluiași obiect, iar dacădatele sunt publice pot fi utilizate și în părti ale programului care există în afara acelui obiect.

Clasa este unitatea fundamentală de incapsulare. Aceasta specifică datele și codul

ce este responsabil cu operarea asupra datelor. O clasă definește forma unui obiect. Sau altfel spus, o clasa reprezintă o matrița, iar un obiect reprezintă o instanța a clasei.

Polimorfismul

Polimorfismul este capacitatea unor entiați de a lua diferite forme . Altfel spus este calitatea care permite unei interfețe accesul la un grup generic de acțiuni. Termenul de polimorfism este derivat dintr-un cuvânt grecesc cu semnificația “cu mai multe forme”.Să presupunem ca este nevoie de o rutină caresă returneze aria unei forme geometrice, acesta poate fi un triunghi, cerc sau trapez. Deoareceariile celor trei forme se calculează diferit, rutina trebuiesă se adapteze la datele pe care le primește astfel incâtsă distingă despre ce fel de formă este vorba și săpoată returna rezultatul corect.

Conceptul de polimorfism este exprimat prin sintagma “o singură interfață mai mlte

metode”.

Moștenirea

Moștenirea este mecanismul princare o clasă poate prelua structura și comportamentul unei clase la care adaugă elemente specifice. Astfel fiecare dată sau funcție membru a clasei principale se moștenește în clasa derivată unde diferă doar protecția acestora.Clasa existentă adică clasa care va fi mostenită se numeste clasa de baza, parinte sau superclasă. Clasa care va extinde această clasă se numește subclasă sau clasă derivată.

Atunci când este creată o clasa, aceasta poate fi utilizată pentru a crea o mulțime de

obiecte. Prin utilizarea moștenirii și încapsulării clasa amintită poate fi reutilizată. Nu mai

este nevoiesă testăm codul respectiv ci doar să il utlizăm corect.

Abstractizarea

Abstractizarea reprezintă procesul de grupare a datelor și a metodelor de prelucrare. Astfel putem definiiacest proces ca fiind un proces în care luăm obiecte reale și le transformăm în concepte virtuale. Metodele folosite sunt declarate pentru a putea fi apelate iar implemetarea lor se face în clase derivate. Aceste clase abstracte nu pot fi instanțiate.Clasele derivate vor fi nevoitesă implementeze metode abstracte moștenite sau vor fi la randul lor abstracte. Este permis ca o clasa abstractă să dețina variabile de instanță și de clasa și poate avea metode implementate. Acestea vor fi implementate de clasele derivate și vor face parte din obiectele de tipul clasei derivate.

Tipuri valorice în C#

Operatorii și tipurile de date stau la baza fiecărui limbaj de programare. Acestea stabilesc limitele oricarui limbaj și determina pentru ce tipuri de activități poate fi utilizat. C# ofera o

gamă largăde tipuri de date și operatori și este puternic tipizat. Asadar

pentru toate operațiile, compilatorul face verificări asupra compatibilitații

tipurilor.

Limbajul C# cuprinde doua categorii generale de tipuri de date predefinite: valorice și

referintă. Tipurile referintă din C# sunt definite de clase La declararea acestora nu are loc automat alocarea spațiului.Acestea sunt inițial de tip null. Este nevoie de o alocare implicita de memorie, iar la atribuirea acesteia este copiată referința intr-o destinație, obiectul spre care este indicat ramânând același.În cazul tipurilor de date numerice, când o variabila este declarată este nevoie și de alocarea spațiului pentru ea. când atribuirea are loc, se face o copie a datelor în variabila destinație care nu mai este legată de variabila inițială.

La baza limbajului C# sunt 13 tipuri valorice deoarece există o relație directa intre tipurile de date C# și tipurile de date .NET.

Fiecare dintre aceste tipurile valorice are domeniu fix de valori. În limbajul C, o varabila de tip int este reprezentată pe 2 octeți sau 4 octeți, în funcție de platforma utilizata, în C# unei variabile de tip int, ii asunt alocati 4 octeti, indiferent de mediul de execuție.

Intregi

în C# sunt definite noua tipuri intregi: char, byte, sbyte, short, ushort, int, uint, long si

ulong.

Pentru tipul char caracterele nu sunt reprezentate pe 8 biți ca în alte limbaje (spre exemplu

C sau C++ ). C# utilizează modelul Unicode. Se defineste un set de caractere care

poate repezenta caracterele din toate limbile de pe Pamant. Setul de caractere ASCII pe 8

biți, cuprins intre 0 și 127 reprezintă o submulțime a modelului Unicode. Dacă se va atribui o valoare de tip caracter trebuiesă includem caracterul între apostrofuri simple. De exmplu : char ch=‘D’ ;

Chiar dacă char este de tip întreg, nu poate fi amestecat cu valori întregi deoarece nu

se pot efectua conversii automate intre char și restul de tipuri intregi. Exemplul urmator este

incorect: char ch=11; nu functionează deoarece 11 este o

valoare intreagă și poate fi convertită automat la tipul char. De aceea este nevoie de o

conversie explicita (un cast)pentru corectarea codului: char ch=(char) 11;

Restul de tipuri intregi sunt utilizate pentru calcule numerice.

Asemănător limbajului C diferența între întregii cu semn și cei fară

semn este interpretarea bitului cel mai semnificativ. când este specificat un intreg cu

semn, atunci numărul este pozitiv dacă bitul de semn este 0 și respectiv negativ dacă bitul de

semn are valoarea 1.

Literali

În C# literalii desemnează valorile fixate, reprezentate intr-un mod accesibil

utilizatorului. Numarul 40 este un literal. Literalii poartă numele și de constante. Constantele

în C# pot fi de orice tip valoric. Constantele de tip caracter trebuiesă fie încadrate între apostrofuri (exemple: ‘a’, ‘$’, etc.) în cazul literalilor intregi, tipul fiecărui literal este cel mai mic tip întreg ce permite memorarea sa, incepand de la int. Orice literal întreg poate fi de tipul: int, uint, long sau ulong. Pentru definirea unui literal uint se adaugă un u sau U. Exemplu:

189 este de tip int în timp ce 189u este de tip uint. în același mod se procedeaza în cazul literalilor de tip long unde se adauga l sau L în timp ce pentru literali de tip ulong se adaugă ul sau UL.

Pentru literalii în virgulă mobilă sunt în mod implicit de tip double dacă dorimsă specificăm

un literal de tip float adaugăm f sau F (de exemplu, 123.4f este de tip float).

În cazul unui literal de tip decimal se adaugă sufixul m sau M (ex: 1.43m), iar pentru un literal hexazecimal se utilizează prefixul 0x (ex: 1) c=0xFF;

//255 în zecimal, 2) in=0x1a; //26 în zecimal).

2.5.3 Secvențe escape pentru caractere

Majoritatea caracterelor pot fi afișate incluzând constantele de tip caracter intre

apostrofuri. Există insă cateva caractere care ridica probleme deosebite precum ghilimelele,

apostroful etc., care au semnificații speciale. Din acest motiv, C# pune la dispozitie

secvențe escape, care sunt utilizate în locul caracterelor pe care le reprezintă.

Secevențele escape reprezintă succesiuni de caractere ce incep cu \ s au următoarel forme: \000 în care 000 reprezintă trei cfre ale sistemulu octal, \uhhhh în care hhh reprezintă 4 cifre hexazecimale, \c în care c este unul din caractele b,t,f,r,”,’ sau \ . dacă folosim \b se realizează deplassarea cu o pozitie la stânga, pentru \t tabulare orizontală, \n trecere la linie noua, \f salt la o pagină noua, \r întoarcerea carului, \” ghilimele, \\ bară inversă, \’ apostrof.

În C# exită și un alt tip de literali: tipul string. Acesta reprezintă un sir de caractere inclus între ghilimele (ex: “primul string”). Unui literal de tip string i se permitesă conțină mai multe secvențe escape. În C# se pot utiliza literalii numiți “copie la indigo”. Un astfel de program începe cu @, urmat de un șir de ghilimele. Se pot include astfel caractere tab, linie noua, etc fără a utiliza secvențe escape.

Variabile

În C# datele sunt stocate în variabile. Aceste variabile pot memora numere,text,data sau tipul.

O variabilăeste olocație de memorie cu nume, căreia i se poate atribui o valoare. Valoarea unei variabile este permis să fie modificată pe parcursul programului. O instrucțiune pentru declararea variabilelor este de forma: tip nume_var; unde tip reprezintă tipul variabilei, iar nume_var numele variabilei. Orice variabilă trebuie declarată inainte de a fi folosită, iar tipul

variabilei nu poate fi modificat pe parcursul duratei sale de viața. Tipul variabilei va determina

operațiile permise asupra variabilei. Dupa ce se efectueazădeclararea variabilei, aceasta trebuie inițializată, printr-o instrucțiune de atribuire: nume_var=val;

unde val reprezintă valoarea atribuită variabilei nume_var (Exemple: int i=10; bool f=true; foat

fn=12.4f; long o=126L). Inițializarea poate fi facută și dinamic, utilizând orice

expresie validă la momentul în care variabila este inițializată.

ASP .NET MVC

ASP.NET MVC este un framework destinat programării web livrat de către Microsoft ce combină eficacitatea și curațenia unei arhitecturi de tip MVC model-view-controller, cele mai recente idei și tehnici în legatură cu agile development și cea mai bună parte a platformei deja existente ASP.NET. Este o alternativă completă a tradiționalului ASP.Net Web forms, oferind avantaje considerabile pentru toate tipurile de proiecte bazate pe web development.

ASP.net a generat un success commercial incredibil, dar lumea programării web a evoluat chiar dacă Microsoft a tinut pasul cu noile tendințe.

Arhitectura MVC

Este importantsă se facă diferența intre arhitectura MVC și ASP.NET MVC Framework. Pattern-ul MVC nu este nou, el datând încă din aii 1978 dar a câștiat o popularitate enormă în prezent ca o arhitectură pentru aplicații web din cauza mai multor motive. Interacțiunea user-uui cu o aplicație MVC urmărește un ciclu natural. Userul poate face modificări și este responsabil pentru acestea, iar ciclul se repetă. Acesta reprezintă un convenient pentru aplicațiile web care sunt livrate ca oserie de cereri și răspunsuri HTTP. Un alt motiv pentru popularitatea MVC este acela că aplicațiile web necesită o multitudine de combinații de tehnologii (database, html,cod executabil,etc) iar MVC facilitează utilizarea și îmbinarea acestora cu usurință.

ASP.NET MVC Framework implementează MVC pattern. Făcând asta devine un competitor principal pentru Ruby on Rails, sau alte platforme similare.

Pattern-ul Model-View-Controller (MVC) separă o aplicație web în trei parti

principale:

M: model (Model) Modelul conține o mulțime de clase ce reprezintă datele cu

care se lucrează și regulile de interacțiune ale acestora.

V: vizualizare (View User Interface) View definește interfața

aplicației.

C: controler (Controller) Controller-ul conține o mulțime de clase responsabile de gestionarea comunicării de la utilizator și logica specifică aplicației.

In ASP.NET MVC acesta este translatat astfel:

Model: Este partea aplicației care se ocupă de logica datelor din aplicație.Acesta este format din clase ce reprezintă domeniul aplicației. Aceste obiecte sunt responsabile de

încapsularea datelor memorate intr-o bază de date precum și cod folosit

pentru a manipula datele și a executa acțiuni specifice logicii aplicației. 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.

View: Este partea aplicației care este responsabilă de interfața aplicației.View este un template pentru a genera în mod dinamic HTML.

Controller: este partea aplicației ceasigură interacțiunea userului. Controller este o clasa speciala ce gestionează relațiile dintre View și

Model. Acesta răspunde la acțiunile utilizatorului, comunică cu modelul și

decide ce vizualizare trebuie afisată (daca exista una). în ASP.NET MVC, numele

acestei clase conține sufixul Controller.

Structura unei aplicații ASP.NET MVC

/Controllers clasele pentru Controller ce gestioneaza cererile URL

/Models Conține clasele ce reprezintă datele modelului

/Views Conține fițiere template UI responsabile pentru afișarea rezultatului.

/Scripts Conține biblioteci JavaScript și scripturi (.js).

/Images Conține imaginile folosite în cadrul aplicației.

/Content Putem pune CSS sau alt conținut dar nu scripturi și/sau imagini.

/Filters Conține codul pentru filtre.

/App_Data Conține fisierele de date Read/Write.

/App_Start Conține cod de configurare, grupări de fișiere și Web API.

Modele, View-uri și Controller-e (C#)

Există o mulțime de motive pentru care utilizatorul trebuiesă ofere importanță structurii URL. în pimul rând motoarele de cautare acordă importanță cuvintelor folosite.In al doilea rând mulți utilizatori web stiu cumsă utilizeze și să înteleagă un URL. În al treilea rând când cineva intelege structura URL-ului, este mult mai simplusă il atragă și chiarsă o împartă cu alți utilizatori.

Când utilizatorul crează o aplicație ASP.NET MVC , aplicația este deja configurată să folosească ASP.NET Routing. În primul rând Asp.Net Routing este activate in cadrul fișierului Web.config al aplicației. In ASP.NET Web Forms este o corespondență intre URL și pagină (pentru fiecare pagină se apelează fișierul *.aspx corespunzător).
În continuare voi prezenta cum am aplicat MVC pe aplicația web realizată de mine.

2.7.3 Rutarea

Se folosește o tabela de rutare pentru a trata cererile ce apar.

Rutarea din ASP.NET este folosită de ASP.NET MVC.

Când o aplicație MVC pornește pentru prima dată metoda Application_Start() este apelată. Această metodă apelează la randul ei metoda RegisterRoutes(), cea precedentă urmândsă creeze tabela de rutare.

Tabela de rutare conține by default singura rută. Aceata mapează primul segment al URL-ului la numele controller-ului, iar al doilea segment al URL-ului unei acțiuni al controllerului, iar al treilea segment unui parametru numit id.

Metoda folosită pentru a înregistra o ruta este RegisterRoutes în care se adaugă o

intrare în RouteCollection folosind metoda MapRoute sau MapPageRoute. Codul

se plasează în Global.asax în cadrul apelului metodei Application_Start.

O rută este compusa din :

nume

URL cu parametri : "{controller}/{action}/{id}"

parametri dați sub forma unui obiect. Un exemplu este :

new { controller = "Home", action = "Index", id = "" }

Exemplu – Global.asax

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Http;

using System.Web.Mvc;

using System.Web.Optimization;

using System.Web.Routing;

namespace InfoStudent

{

publicclassMvcApplication : System.Web.HttpApplication

{

protectedvoid Application_Start()

{

AreaRegistration.RegisterAllAreas();

WebApiConfig.Register(GlobalConfiguration.Configuration);

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

RouteConfig.RegisterRoutes(RouteTable.Routes);

BundleConfig.RegisterBundles(BundleTable.Bundles);

AuthConfig.RegisterAuth();

}

}

}

2.7.4 Controller

Folderul Controller conține clasele controller-ului pentru a putea trata input-urile de la utilizatori. Cu alte cuvinte acesta raspunde la interacțiunile utilizatorului cu aplicația).

Controllerul conține logica desfășurării aplicației.

Un controller este o clasa al carei nume trebuiesă se termine (obligat) cu controller și este derivat din clasa Controller.
Aplicația mea folosește 7 Controlleri

using System;

using System.Collections.Generic;

using System.Linq;

using System.Transactions;

using System.Web;

using System.Web.Mvc;

using System.Web.Security;

using DotNetOpenAuth.AspNet;

using Microsoft.Web.WebPages.OAuth;

using WebMatrix.WebData;

using InfoStudent.Filters;

using InfoStudent.Models;

namespace InfoStudent.Controllers

{

[Authorize]

[InitializeSimpleMembership]

publicclassAccountController : Controller

{

//

// GET: /Account/Login

[AllowAnonymous]

publicActionResult Login(string returnUrl)

{

ViewBag.ReturnUrl = returnUrl;

return View();

}

//

// POST: /Account/Login

[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]

publicActionResult Login(LoginModel model)

{

if (ModelState.IsValid &&WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))

{

UsersContext b = newUsersContext();

var x = model.UserName;

var ver = b.UsersInRoless.FirstOrDefault(p => p.UserName == x);

var statut = b.Roless.First(p => p.RoleId == ver.RoleId);

if ((statut.RoleName == "angajat"))

{

return RedirectToAction("Index", "Angajat");

}

else

if ((statut.RoleName == "contabil"))

{

return RedirectToAction("Index", "Contabil");

}

else

if ((statut.RoleName == "leader"))

{

return RedirectToAction("Index", "TeamLeader");

}

else

if ((statut.RoleName == "ceo"))

{

return RedirectToAction("Index", "CEO");

}

return RedirectToAction("Index","Home");

}

// If we got this far, something failed, redisplay form

ModelState.AddModelError("", "The user name or password provided is incorrect.");

return View(model);

}

//

// POST: /Account/LogOff

[HttpPost]

[ValidateAntiForgeryToken]

publicActionResult LogOff()

{

WebSecurity.Logout();

return RedirectToAction("Index", "Home");

}

//

// GET: /Account/Register

[AllowAnonymous]

publicActionResult Register()

{

return View();

}

//

// POST: /Account/Register

[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]

publicActionResult Register(RegisterModel model)

{

if (ModelState.IsValid)

{

// Attempt to register the user

try

{

//WebSecurity.CreateUserAndAccount(model.UserName, model.Password);

WebSecurity.CreateUserAndAccount(model.UserName, model.Password,

propertyValues: new

{ Password=model.Password,

UserFirstName = model.UFirstName,

UserLastName = model.ULastName,

Email = model.Email,

City = model.City,

Age=21,

Roles= model.Roles

});

using (UsersContext db = newUsersContext())

{

//}

UsersInRoles p = newUsersInRoles();

if (model.Roles == "angajat")

{

p = newUsersInRoles

{

RoleId = 1,

UserName = model.UserName

};

db.UsersInRoless.Add(p);

db.SaveChanges();

return RedirectToAction("ListaCereri", "Angajat");

}

if (model.Roles == "ceo")

{

p = newUsersInRoles

{

RoleId = 2,

UserName = model.UserName

};

db.UsersInRoless.Add(p);

db.SaveChanges();

return RedirectToAction("Index", "CEO");

}

if (model.Roles == "leader")

{

p = newUsersInRoles

{

RoleId = 3,

UserName = model.UserName

};

db.UsersInRoless.Add(p);

db.SaveChanges();

return RedirectToAction("Index", "TeamLeader");

// db.SaveChanges();

}

if (model.Roles == "contabil")

{

p = newUsersInRoles

{

RoleId = 4,

UserName = model.UserName

};

db.UsersInRoless.Add(p);

db.SaveChanges();

return RedirectToAction("Index", "Contabil");

// db.SaveChanges();

}

// db.SaveChanges();

}

WebSecurity.Login(model.UserName, model.Password);

// WebSecurity.RequireRoles("angajat", "ceo", "leader", "contabil");

return RedirectToAction("Index", "Home");

}

catch (MembershipCreateUserException e)

{

ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));

}

}

// If we got this far, something failed, redisplay form

return View(model);

}

//

// POST: /Account/Disassociate

[HttpPost]

[ValidateAntiForgeryToken]

publicActionResult Disassociate(string provider, string providerUserId)

{

string ownerAccount = OAuthWebSecurity.GetUserName(provider, providerUserId);

ManageMessageId? message = null;

// Only disassociate the account if the currently logged în user is the owner

if (ownerAccount == User.Identity.Name)

{

// Use a transaction to prevent the user from deleting their last login credential

using (var scope = newTransactionScope(TransactionScopeOption.Required, newTransactionOptions { IsolationLevel = IsolationLevel.Serializable }))

{

bool hasLocalAccount = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));

if (hasLocalAccount || OAuthWebSecurity.GetAccountsFromUserName(User.Identity.Name).Count > 1)

{

OAuthWebSecurity.DeleteAccount(provider, providerUserId);

scope.Complete();

message = ManageMessageId.RemoveLoginSuccess;

}

}

}

return RedirectToAction("Manage", new { Message = message });

}

//

// GET: /Account/Manage

publicActionResult Manage(ManageMessageId? message)

{

ViewBag.StatusMessage =

message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."

: message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."

: message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."

: "";

ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));

ViewBag.ReturnUrl = Url.Action("Manage");

return View();

}

//

// POST: /Account/Manage

[HttpPost]

[ValidateAntiForgeryToken]

publicActionResult Manage(LocalPasswordModel model)

{

bool hasLocalAccount = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));

ViewBag.HasLocalPassword = hasLocalAccount;

ViewBag.ReturnUrl = Url.Action("Manage");

if (hasLocalAccount)

{

if (ModelState.IsValid)

{

// ChangePassword will throw an exception rather than return false în certain failure scenarios.

bool changePasswordSucceeded;

try

{

changePasswordSucceeded = WebSecurity.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword);

}

catch (Exception)

{

changePasswordSucceeded = false;

}

if (changePasswordSucceeded)

{

return RedirectToAction("Manage", new { Message = ManageMessageId.ChangePasswordSuccess });

}

else

{

ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");

}

}

}

else

{

// User does not have a local password so remove any validation errors caused by a missing

// OldPassword field

ModelState state = ModelState["OldPassword"];

if (state != null)

{

state.Errors.Clear();

}

if (ModelState.IsValid)

{

try

{

WebSecurity.CreateAccount(User.Identity.Name, model.NewPassword);

return RedirectToAction("Manage", new { Message = ManageMessageId.SetPasswordSuccess });

}

catch (Exception)

{

ModelState.AddModelError("", String.Format("Unable to create local account. An account with the name \"{0}\" may already exist.", User.Identity.Name));

}

}

}

// If we got this far, something failed, redisplay form

return View(model);

}

//

// POST: /Account/ExternalLogin

[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]

publicActionResult ExternalLogin(string provider, string returnUrl)

{

returnnewExternalLoginResult(provider, Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));

}

//

// GET: /Account/ExternalLoginCallback

[AllowAnonymous]

publicActionResult ExternalLoginCallback(string returnUrl)

{

AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));

if (!result.IsSuccessful)

{

return RedirectToAction("ExternalLoginFailure");

}

if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))

{

return RedirectToLocal(returnUrl);

}

if (User.Identity.IsAuthenticated)

{

// If the current user is logged în add the new account

OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name);

return RedirectToLocal(returnUrl);

}

else

{

// User is new, ask for their desired membership name

string loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);

ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;

ViewBag.ReturnUrl = returnUrl;

return View("ExternalLoginConfirmation", newRegisterExternalLoginModel { UserName = result.UserName, ExternalLoginData = loginData });

}

}

//

// POST: /Account/ExternalLoginConfirmation

[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]

publicActionResult ExternalLoginConfirmation(RegisterExternalLoginModel model, string returnUrl)

{

string provider = null;

string providerUserId = null;

if (User.Identity.IsAuthenticated || !OAuthWebSecurity.TryDeserializeProviderUserId(model.ExternalLoginData, out provider, out providerUserId))

{

return RedirectToAction("Manage");

}

if (ModelState.IsValid)

{

// Insert a new user into the database

using (UsersContext db = newUsersContext())

{

UserProfile user = db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == model.UserName.ToLower());

// Check if user already exists

if (user == null)

{

// Insert name into the profile table

db.UserProfiles.Add(newUserProfile { UserName = model.UserName });

db.SaveChanges();

OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName);

OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

return RedirectToLocal(returnUrl);

}

else

{

ModelState.AddModelError("UserName", "User name already exists. Please enter a different user name.");

}

}

}

ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;

ViewBag.ReturnUrl = returnUrl;

return View(model);

}

//

// GET: /Account/ExternalLoginFailure

[AllowAnonymous]

publicActionResult ExternalLoginFailure()

{

return View();

}

[AllowAnonymous]

[ChildActionOnly]

publicActionResult ExternalLoginsList(string returnUrl)

{

ViewBag.ReturnUrl = returnUrl;

return PartialView("_ExternalLoginsListPartial", OAuthWebSecurity.RegisteredClientData);

}

[ChildActionOnly]

publicActionResult RemoveExternalLogins()

{

ICollection<OAuthAccount> accounts = OAuthWebSecurity.GetAccountsFromUserName(User.Identity.Name);

List<ExternalLogin> externalLogins = newList<ExternalLogin>();

foreach (OAuthAccount account în accounts)

{

AuthenticationClientData clientData = OAuthWebSecurity.GetOAuthClientData(account.Provider);

externalLogins.Add(newExternalLogin

{

Provider = account.Provider,

ProviderDisplayName = clientData.DisplayName,

ProviderUserId = account.ProviderUserId,

});

}

ViewBag.ShowRemoveButton = externalLogins.Count > 1 || OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));

return PartialView("_RemoveExternalLoginsPartial", externalLogins);

}

#region Helpers

privateActionResult RedirectToLocal(string returnUrl)

{

if (Url.IsLocalUrl(returnUrl))

{

return Redirect(returnUrl);

}

else

{

return RedirectToAction("Index", "Home");

}

}

publicenumManageMessageId

{

ChangePasswordSuccess,

SetPasswordSuccess,

RemoveLoginSuccess,

}

internalclassExternalLoginResult : ActionResult

{

public ExternalLoginResult(string provider, string returnUrl)

{

Provider = provider;

ReturnUrl = returnUrl;

}

publicstring Provider { get; privateset; }

publicstring ReturnUrl { get; privateset; }

publicoverridevoid ExecuteResult(ControllerContext context)

{

OAuthWebSecurity.RequestAuthentication(Provider, ReturnUrl);

}

}

privatestaticstring ErrorCodeToString(MembershipCreateStatus createStatus)

{

// See http://go.microsoft.com/fwlink/?LinkID=177550 for

// a full list of status codes.

switch (createStatus)

{

caseMembershipCreateStatus.DuplicateUserName:

return"User name already exists. Please enter a different user name.";

caseMembershipCreateStatus.DuplicateEmail:

return"A user name for that e-mail address already exists. Please enter a different e-mail address.";

caseMembershipCreateStatus.InvalidPassword:

return"The password provided is invalid. Please enter a valid password value.";

caseMembershipCreateStatus.InvalidEmail:

return"The e-mail address provided is invalid. Please check the value and try again.";

caseMembershipCreateStatus.InvalidAnswer:

return"The password retrieval answer provided is invalid. Please check the value and try again.";

caseMembershipCreateStatus.InvalidQuestion:

return"The password retrieval question provided is invalid. Please check the value and try again.";

caseMembershipCreateStatus.InvalidUserName:

return"The user name provided is invalid. Please check the value and try again.";

caseMembershipCreateStatus.ProviderError:

return"The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

caseMembershipCreateStatus.UserRejected:

return"The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

default:

return"An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

}

}

#endregion

}

}

Mai sus este Controllerul care se ocupa de partea de Login. în caz de erori se afisează mesaje sugestive. De fiecare dată când se contectează, se deconectează sau înregistrează, utilizatorul este redirecționat pe pagina principală.Utilizatorul iși alege la inregistrare statutul. Acesta poate fi angajat, team leader, CEO sau contabil.. Atunci când un user se înregistrează se cauta în baza ca acestasă nu mai existe deja..

În continuare voi prezenta Controllerul angajatului. Angajatul își poate vedea lista de proiecte asignate în timp real. în funcție de aceste proiecte el iși poate alege perioada de concediul astfel încât aceastasă nu se suprapuna cu ultima zi de predare a unui proiect în curs. Deasemenea angajatul are acces catre o lista de raspunsuri primite de la CEO pentru cererile de concediu trimise.

using InfoStudent.Models;

using System;

using System.Collections.Generic;

using System.Data.Entity;

using System.Linq;

using System.Web;

using System.Web.Mvc;

namespace InfoStudent.Controllers

{

publicclassAngajatController : Controller

{

//

// GET: /Angajat/

//[Authorize(Roles = "angajat")]

publicActionResult Index()

{

UsersContext b = newUsersContext();

var x = User.Identity.Name;

var ver = b.UsersInRoless.FirstOrDefault(p => p.UserName == x);

var statut = b.Roless.First(p => p.RoleId == ver.RoleId);

if (!(statut.RoleName == "angajat"))

{

return RedirectToAction("Index", "Eroare");

}

return View();

}

[AllowAnonymous]

publicActionResult Calendar()

{

//ViewBag.ReturnUrl = returnUrl;

return View();

}

[HttpPost]

[AllowAnonymous]

// [ValidateAntiForgeryToken]

publicActionResult Calendar(CalendarModel model)

{

DateTime now = DateTime.Now;

if ((model.DataInceput <= model.DataSfarsit) &&

(model.DataInceput != null) &&

(model.DataSfarsit != null)) //&&

// (model.StartDate >= now))

{

UsersContext1 db = newUsersContext1();

db.Calendars_Ceo.Add(newCalendar_Ceo {

User = User.Identity.Name,

DataInceput = model.DataInceput,

DataSfarsit = model.DataSfarsit,

Nume = model.Nume,

Prenume = model.Prenume,

Tip = model.Tip

});

db.SaveChanges();

return RedirectToAction("Confirmare", "Angajat");

}

return View(model);

}

[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]

publicActionResult Afiseaza(RegisterModel model)

{

return View(model);

}

publicActionResult CalendarFull(CalendarModel Model)

{

CalendarModel model;

return View();

}

publicActionResult Confirmare(CalendarModel Model)

{

CalendarModel model;

return View();

}

publicActionResult ListaCereri(Calendar_Ceo Model)

{

//CereriModels model;

UsersContext1 a = newUsersContext1();

//var model = a.Calendars_Ceo.Select(u => Model.Id).ToList();

/* var model = new CereriModels

{

Id = Model.Id,

StartDate = Model.StartDate,

EndDate = Model.EndDate,

User = Model.User

};

*/

var model = a.Calendars_Ceo.AsEnumerable().Where(p => p.Id != 0).ToList();

return View(model);

}

publicActionResult ListaProiecte(ProiecteAngajat Model)

{

//CereriModels model;

UsersContext1 a = newUsersContext1();

//var model = a.Calendars_Ceo.Select(u => Model.Id).ToList();

/* var model = new CereriModels

{

Id = Model.Id,

StartDate = Model.StartDate,

EndDate = Model.EndDate,

User = Model.User

};

*/

var model = a.ProiecteAngajats.AsEnumerable().Where(p => p.Id != 0).ToList();

return View(model);

}

publicActionResult RaspunsCeo(Raspuns_Angajat Model)

{

//CereriModels model;

UsersContext1 a = newUsersContext1();

//var model = a.Calendars_Ceo.Select(u => Model.Id).ToList();

/* var model = new CereriModels

{

Id = Model.Id,

StartDate = Model.StartDate,

EndDate = Model.EndDate,

User = Model.User

};

*/

var id = User.Identity.Name;

var model = a.Raspuns_Angajats.AsEnumerable().Where(p => p.User == id).ToList();

return View(model);

}

}

}

In continuare Controllerul de CEO. Oferă utilizatorului posibilitatea de a aproba sau nu cererile primite de la angajați mai întâi aprobate de către team leader. El poate săadauge eventuale proiecte pentru ca mai apoi team leader-ulsă le asigneze echipei.

using InfoStudent.Models;

using System;

using System.Collections.Generic;

using System.Data.Entity;

using System.Linq;

using System.Web;

using System.Web.Mvc;

namespace InfoStudent.Controllers

{

publicclassCEOController : Controller

{

//

// GET: /Angajat/

// [Authorize(Roles = "angajat")]

//[Authorize(Roles = "ceo")]

publicActionResult Index(Calendar_Ceo Model)

{

//CereriModels model;

UsersContext1 a = newUsersContext1();

//var model = a.Calendars_Ceo.Select(u => Model.Id).ToList();

/* var model = new CereriModels

{

Id = Model.Id,

StartDate = Model.StartDate,

EndDate = Model.EndDate,

User = Model.User

};

*/

UsersContext b = newUsersContext();

var x = User.Identity.Name;

var ver = b.UsersInRoless.FirstOrDefault(p => p.UserName == x);

var statut = b.Roless.First(p => p.RoleId == ver.RoleId);

if (!(statut.RoleName == "ceo")){

return RedirectToAction("Index", "Eroare");

}

var model = a.Calendars_Ceo2.AsEnumerable().Where(p => p.Id != 0).ToList();

return View(model);

}

publicActionResult Proiecte(Proiecte Model)

{

//CereriModels model;

UsersContext1 a = newUsersContext1();

//var model = a.Calendars_Ceo.Select(u => Model.Id).ToList();

/* var model = new CereriModels

{

Id = Model.Id,

StartDate = Model.StartDate,

EndDate = Model.EndDate,

User = Model.User

};

*/

var model = a.Proiectes.AsEnumerable().Where(p => p.Id != 0).ToList();

return View(model);

}

publicActionResult Aproba( int id){

UsersContext1 db = newUsersContext1();

var model = db.Calendars_Ceo2.First(p => p.Id == id);

db.Calendars_Ceo2.Remove(model);

db.SaveChanges();

return RedirectToAction("Index");

//return View(model);

}

[AllowAnonymous]

publicActionResult AdaugaProiect()

{

return View();

}

[HttpPost]

[AllowAnonymous]

publicActionResult AdaugaProiect(Proiecte model)

{

UsersContext1 db = newUsersContext1();

db.Proiectes.Add(newProiecte

{

Titlu = model.Titlu,

Descriere = model.Descriere,

EndDate = model.EndDate

});

db.SaveChanges();

return RedirectToAction("Index", "CEO");

}

}

}

Controller-ul team leaderului ofera posibilitatea utilizatului de a putea trimite catre CEO cererile de concediu primite de la angajați având acordul său. în cazul în care acesta nu este de accord cu cererea o poate refuza și ea se întoarce la angajat.De asemenea asignează proiectele primite de la CEO.

using InfoStudent.Models;

using System;

using System.Collections.Generic;

using System.Data.Entity;

using System.Linq;

using System.Web;

using System.Web.Mvc;

namespace InfoStudent.Controllers

{

publicclassTeamLeaderController : Controller

{

//

// GET: /Angajat/

// [Authorize(Roles = "angajat")]

//[Authorize(Roles = "leader")]

publicActionResult Index(Calendar_Ceo Model)

{

//CereriModels model;

UsersContext1 a = newUsersContext1();

//var model = a.Calendars_Ceo.Select(u => Model.Id).ToList();

/* var model = new CereriModels

{

Id = Model.Id,

StartDate = Model.StartDate,

EndDate = Model.EndDate,

User = Model.User

};

*/

UsersContext b = newUsersContext();

var x = User.Identity.Name;

var ver = b.UsersInRoless.FirstOrDefault(p => p.UserName == x);

var statut = b.Roless.First(p => p.RoleId == ver.RoleId);

if (!(statut.RoleName == "leader"))

{

return RedirectToAction("Index", "Eroare");

}

var model = a.Calendars_Ceo.AsEnumerable().Where(p => p.Id != 0).ToList();

return View(model);

}

publicActionResult Aproba(Calendar_Ceo Model, int id){

UsersContext1 db = newUsersContext1();

var model = db.Calendars_Ceo.First(p => p.Id == id);

db.Calendars_Ceo2.Add(newCalendar_Ceo2

{

User = model.User,

DataInceput = model.DataInceput,

DataSfarsit = model.DataSfarsit,

Nume = model.Nume,

Prenume = model.Prenume,

Tip = model.Tip

});

db.SaveChanges();

db.Raspuns_Angajats.Add(newRaspuns_Angajat

{

User = model.User,

Status = 1,

DataInceput = model.DataInceput,

DataSfarsit = model.DataSfarsit,

Nume = model.Nume,

Prenume = model.Prenume,

Tip= model.Tip

});

db.SaveChanges();

db.Calendars_Ceo.Remove(model);

db.SaveChanges();

return RedirectToAction("Index");

//return View(model);

}

publicActionResult Sterge(int id)

{

UsersContext1 a = newUsersContext1();

var m = a.Calendars_Ceo.First(p => p.Id == id);

a.Raspuns_Angajats.Add(newRaspuns_Angajat

{

User = m.User,

Status = 0,

DataInceput = m.DataInceput,

DataSfarsit = m.DataSfarsit,

Nume = m.Nume,

Prenume = m.Prenume,

Tip = m.Tip

});

a.SaveChanges();

a.Calendars_Ceo.Remove(m);

a.SaveChanges();

return RedirectToAction("Index");

}

publicActionResult Proiecte(Proiecte Model)

{

//CereriModels model;

UsersContext1 a = newUsersContext1();

//var model = a.Calendars_Ceo.Select(u => Model.Id).ToList();

/* var model = new CereriModels

{

Id = Model.Id,

StartDate = Model.StartDate,

EndDate = Model.EndDate,

User = Model.User

};

*/

var model = a.Proiectes.AsEnumerable().Where(p => p.Id != 0).ToList();

return View(model);

}

publicActionResult Accepta(int id)

{

UsersContext1 db = newUsersContext1();

var model = db.Proiectes.First(p => p.Id == id);

db.ProiecteAngajats.Add(newProiecteAngajat

{

Titlu = model.Titlu,

Descriere = model.Descriere,

EndDate = model.EndDate

});

db.SaveChanges();

db.Proiectes.Remove(model);

db.SaveChanges();

return RedirectToAction("Index", "TeamLeader");

//return View(model);

}

}

}

Controller-ul pentru contabil. Contabilul poate trimite cereri de concediu, vede cererile celorlalți angajați , și poate downloada un raport cu cererile de concediu din luna respectiva. using InfoStudent.Models;

using System;

using System.Collections.Generic;

using System.Data.Entity;

using System.IO;

using System.Linq;

using System.Web;

using System.Web.Mvc;

namespace InfoStudent.Controllers

{

publicclassContabilController : Controller

{

//

// GET: /Angajat/

// [Authorize(Roles = "angajat")]

//[Authorize(Roles = "contabil")]

publicActionResult Index(Raspuns_Angajat Model)

{

//CereriModels model;

UsersContext1 a = newUsersContext1();

//var model = a.Calendars_Ceo.Select(u => Model.Id).ToList();

/* var model = new CereriModels

{

Id = Model.Id,

StartDate = Model.StartDate,

EndDate = Model.EndDate,

User = Model.User

};

*/

UsersContext b = newUsersContext();

var x = User.Identity.Name;

var ver = b.UsersInRoless.FirstOrDefault(p => p.UserName == x);

var statut = b.Roless.First(p => p.RoleId == ver.RoleId);

if (!(statut.RoleName == "contabil"))

{

return RedirectToAction("Index", "Eroare");

}

var model = a.Raspuns_Angajats.AsEnumerable().Where(p => p.Id != 0).ToList();

return View(model);

}

publicActionResult Download(Raspuns_Angajat Model)

{

string filename = "rapoarte.txt";

string path = "C:\\Users\\Babu\\Desktop\\licenta\\rapoartecontabil\\rapoarte2.txt";

byte[] bts = System.IO.File.ReadAllBytes(path);

string fullName = Path.Combine(path, filename);

byte[] fileBytes = GetFile(path);

return File(

fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, filename);

//return View();

}

byte[] GetFile(string s)

{

System.IO.FileStream fs = System.IO.File.OpenRead(s);

byte[] data = newbyte[fs.Length];

int br = fs.Read(data, 0, data.Length);

if (br != fs.Length)

thrownew System.IO.IOException(s);

return data;

}

[AllowAnonymous]

publicActionResult Calendar()

{

//ViewBag.ReturnUrl = returnUrl;

return View();

}

[HttpPost]

[AllowAnonymous]

// [ValidateAntiForgeryToken]

publicActionResult Calendar(CalendarModel model)

{

DateTime now = DateTime.Now;

if ((model.DataInceput <= model.DataSfarsit) &&

(model.DataInceput != null) &&

(model.DataSfarsit != null)) //&&

// (model.StartDate >= now))

{

UsersContext1 db = newUsersContext1();

db.Calendars_Ceo.Add(newCalendar_Ceo

{

User = User.Identity.Name,

DataInceput = model.DataInceput,

DataSfarsit = model.DataSfarsit,

Nume = model.Nume,

Prenume = model.Prenume,

Tip = model.Tip

});

db.SaveChanges();

return RedirectToAction("Index", "Contabil");

}

return View(model);

}

}

}

2.7.4 Views

Acțiunile expuse mai sus de către controller sunt: Index() [ exact ca index.html ] și

About().

View-urile trebui create în locația corectă.

De exemplu, acțiunii Index din controller-ul Home îi corespunde vizualizarea Index.cshtml

aflata în folderul \Views\Home\ și are numele Index.cshtml.

Regula generală:

Pentru fiecare acțiune există un view cu același nume și extensia .cshtml, fișier plasat în

directorul:

\Views\<nume_controller_fara_sufix_Controller>\

Pentru aplicația realizată avem:

\Views\Home

\Views\Account

\Views\Angajat

\Views\CEO

\Views\Contabil

\Views\Eroare

\Views\Shared

\Views\TeamLeader

2.4.5 Models

Conține logica aplicației, logica de validare și accesul la baza de date.

Clasele se găsesc în \Models\…

Mai jos se găseste un exemplu de model folosit în aplicație folosită de controllerul Account.

namespace InfoStudent.Models

{

publicclassUsersContext : DbContext

{

public UsersContext()

: base("DefaultConnection")

{

}

publicDbSet<UserProfile> UserProfiles { get; set; }

publicDbSet<Roles> Roless { get; set; }

publicDbSet<UsersInRoles> UsersInRoless { get; set; }

}

[Table("UserProfile")]

publicclassUserProfile

{

[Key]

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

publicint UserId { get; set; }

publicstring UserName { get; set; }

publicstring Email { get; set; }

publicstring City { get; set; }

publicstring Roles { get; set; }

}

[Table("Roles")]

publicclassRoles

{

[Key]

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

publicint RoleId { get; set; }

publicstring RoleName { get; set; }

}

[Table("UsersInRoles")]

publicclassUsersInRoles

{

[Key]

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

publicint Id { get; set; }

publicint RoleId { get; set; }

publicstring UserName { get; set; }

}

publicclassRegisterExternalLoginModel

{

[Required]

[Display(Name = "User name")]

publicstring UserName { get; set; }

publicstring ExternalLoginData { get; set; }

}

publicclassLocalPasswordModel

{

[Required]

[DataType(DataType.Password)]

[Display(Name = "Current password")]

publicstring OldPassword { get; set; }

[Required]

[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]

[DataType(DataType.Password)]

[Display(Name = "New password")]

publicstring NewPassword { get; set; }

[DataType(DataType.Password)]

[Display(Name = "Confirm new password")]

[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]

publicstring ConfirmPassword { get; set; }

}

publicclassLoginModel

{

[Required]

[Display(Name = "User name")]

publicstring UserName { get; set; }

[Required]

[DataType(DataType.Password)]

[Display(Name = "Password")]

publicstring Password { get; set; }

[Display(Name = "Remember me?")]

publicbool RememberMe { get; set; }

}

publicclassRegisterModel

{

[Required]

[Display(Name = "User name")]

publicstring UserName { get; set; }

[Required]

[Display(Name = "First name")]

publicstring UFirstName { get; set; }

[Required]

[Display(Name = "Last name")]

publicstring ULastName { get; set; }

[Required]

[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]

[DataType(DataType.Password)]

[Display(Name = "Password")]

publicstring Password { get; set; }

[DataType(DataType.Password)]

[Display(Name = "Confirm password")]

[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]

publicstring ConfirmPassword { get; set; }

//[DataType(DataType.Email)]

[Display(Name = "Email")]

publicstring Email { get; set; }

// [DataType(DataType.City)]

[Display(Name = "City")]

publicstring City { get; set; }

[Display(Name = "Age")]

publicstring Age { get; set; }

[Display(Name = "Roles")]

publicstring Roles { get; set; }

}

publicclassExternalLogin

{

publicstring Provider { get; set; }

publicstring ProviderDisplayName { get; set; }

publicstring ProviderUserId { get; set; }

}

}

RenderBody()

Metoda este referiță ca pagina de Layout. Poate exista numai o metoda RenderBody per

Layout pagina. Este asemanatoare cu controlul ContentPlaceHolder. Metoda indică

unde va fi plasat template-ul vizualizarii în conținutul elementului <body>.

RenderPage()

Paginile layout pot avea conținut ce poate fi adus de pe alte pagini. RenderPage face

exact acest lucru. Metoda are unul sau doi parametri.

Primul parametru indica locația fizică a fisierului, iar al doilea, ce este optional, conține

un array de obiecte ce pot fi plasate pe pagină.

Exemplu

@RenderPage("~/Views/Shared/_AnotherPage.cshtml")

RenderSection()

Metoda are un parametru ce indică numele sectiunii și unul de tip bool ce semnifică dacă

secțiunea este optională sau nu.

Views-urile pot adauga secțiuni folosind urmatorul cod :

@section footer

{ <b> Pagina subsol aici </b> }

Baze de date

2.8.1 Descrierea entitatilor și a relatiior

Entitatea reprezintă un concept important al unui model real analizat. Entitatea poate fi slabă sau tare, în funcție de dependența sade altă entitate. Entitățile devin tabele în modelele relaționale.

Cheia primară este cea care identifică în mod unic o entitate și care este respondabilă pentru definirea diferențelor între diferitele valori ale entității. Propietațile cheii primare sunt unicitatea și simplitatea, neconținând informații de ordin descriptiv.

Raportat la modelul real prezentat, avem urmatoarele entitați Calendar, Calendar_Ceo, Calendars_Ceo2, Proiecte, ProiecteAngajat, RaspunsAngajat, Raspuns_teamleader, , Roles, Users UsersInRoles, ProiecteAngajats.

Mai pe larg, entitățile independente care compun baza de date, au următoarele calități:

Users : aici este reprezentat utilizatorul înregistrat pe site, care și -a introdus în formular datele personale și care are de asemenea are trecut în dreptul sau statul, de angajat, ceo, team leader sau contabil. Cheia primară a acestei entități este user_id.

Calendar: conține perioadele de concediu adăugate de useri. Are cheie primară id.

Calendar_Ceo: conține cererile de concediul primite de la angajați și trimise de către team leader. Are cheia primara id.

Proiecte: conține lista de proiecte adăugate

ProiecteAngajat: conține lista de proiete repartizate angajaților

Roles: conține rolurile fiecărui user în parte, adică de ceo,angajat,team leader sau contabil. Are cheia primară la role_id.

Raspuns_angajat: conține lista de răspunsuri primate de catre agajat

Raspuns_TeamLeader: conține lista de raspunsuri ale team leader-ului

Entitățiile fiind numite, este timpul prezentării relațiile dintre acestea mai amplu:

Relația reprezintă o comunicare între două sau mai multe entități. Valoarea unei relații este definită de comunicarea între valorile entităților pe care le leagă. Asocierea redă raportul care există între entități. Trebuie specificat faptul că existența unei relații este dependentă de existența entităților pe care le leagă. Este permisă existența mai multor relații între două entități.

În modelul de date prezentat, relațiile dintre entități sunt doar binare, astfel constrângerile de cardinalitate, definite de numărul de înregistrări posibile pentru fiecare entitate participant, pot fi de tipul one-to-one(1:1),one-to-many(1:n),many-to-many(m:n).

În continuare urmează o prezentare a modelului complet, cu o descriere foarte detaliată:

Users – Calendar= relație care face legătura între entitățile Users și Calendar. Cardinalitatea minimă: 1-1 ( un user, o cerere) și maximă 1:n (un user poate avea mai multe cereri)

Users – Raspunsuri = relație care leagă entitățile Users și Raspunsuri. Cardinalitatea minimă este de 1-1 (un utilizatorsă primeasca u raspuns), iar cardinalitatea maximă este de 1:n (un utilizator poate să primeasca mai multe raspunsuri).

Users – Proiecte = relație care desemnează legătura dintre tabelele Users și Proiecte.Cardinalitatea minimă este de 1:1(un proiect apartine unei singuruser), iar cea maximă de 1:n ( un proiect poatesă apartina mai multor useri

Users – Roles = relație care leagă tabelele Users și Roles. Cardinalitatea minimă este de 1:1 (un user poatesă contina un singur rol).

Calendar- Raspunsuri : relatia care leaga tabelele Calendar și Raspunsuri. Cardialitatea este de 1:1(o cerere primeste un raspuns)

Proiecte – ProiecteAngajat = relație care desemnează legătura dintre tabelele Proiecte și ProiecteAngajat .Cardinalitatea minimă este de 1:1(un proiect apartine unei singur angajat), iar cea maximă de 1:n ( un proiect poatesă apartina mai multor angajati)

2.8.2 Descrierea atributelor

Atributul este o proprietate de descriere a unei entități sau a unei relații. Spre exemplu, nickname-ul unui utilizator este un atribut al entității USERS, iar id-ul unei cereri a unui user este un atribut al relației ce leagă entitățile USERS și CALENDAR.

Trebuie văzută foarte clar diferența între atribut care devine coloană în modelele relaționale și valoarea lui, care este valoare în coloane. Pentru fiecare atribut trebuie menționate următoarele: numele, tipul fizic (integer, float, text, varchar, boolean), valori posibile, valori implicite, reguli de validare, reguli de constrângere, tipuri compuse.

Urmează o prezentare a atributelor entităților, însoțită de o descriere a fiecăruia, a caracteristicilor și constrăngerilor cărora trebuie să se supună.

Atribute pentru Users

Atributele lui Calendar:

Atributele lui Calendar_CEO

Atributele lui Proiecte

Atributele lui ProiecteAngajat

Atributele lui Raspuns_Angajat

Atributele lui Raspuns_Teamleader

Atributele lui Roles

Atributele lui UsersInRoles

Diagrama entitate-relație

Diagrama entitate-relație este o metoda de schematizare a structurii unei baze de date, într-o maniera grafică. Acest tip de diagrame oferă un mijloc simplu de comunicare a caracteristicilor designului unei baze de date.

Pentru proiectarea diagramei entitate-relație sunt cunoscute anumite reguli:

1.Entitățile sunt reprezentate prin dreptunghiuri

2.Relațiile dintre entități sunt reprezentate prin arce-neorientate

3. Cardinalitatea minimă este scrisă între paranteze, iar cea maximă se scrie fără.

4. Cheia primară are în fata simbolul #

Algoritmul pentru proiectarea diagramei E/R cuprinde următoarele etape:

1. Identificarea entităților din cadrul sistemului analizat

2. Identificarea relațiilor dintre entități și aflarea cardinalității

3. Identificarea atributelor aferente entităților și asocierilor dintre entități

4. Stabilirea atributelor de identificare a entităților, adică stabilirea cheilor

Diagrama E/R este prezentată în continuare:

2.9 Tehnici WEB

2.9.1 HTML

HTML( Hypertext Markup Language) este unul din elementele fundamentale ale WWW ( World Wide Web ). Acesta descrie formatul primar în care documentele sunt distribuite și văzute pe Web. Majoritatea trăsăturilor sale, cum ar fi independența față de platformă, structurarea formatării și legăturile hipertext, însumează un foarte bun format pentru documentele Internet și Web.

“HTML este o formă de marcare orientată către prezentarea documentelor text pe o singura pagină, utilizând un software de redare specializat, numit agent utilizator HTML, cel mai bun exemplu de astfel de software fiind browserul web. HTML furnizează mijloacele prin care conținutul unui document poate fi adnotat cu diverse tipuri de metadate și indicații de redare. Indicațiile de redare pot varia de la decorațiuni minore ale textului, cum ar fi specificarea faptului că un anumit cuvânt trebuie subliniat sau că o imagine trebuie introdusă, până la scripturi sofisticate, hărți de imagini și formulare. Metadatele pot include informații despre titlul și autorul documentului, informații structurale despre cum este împărțit documentul în diferite segmente, paragrafe, liste, titluri etc. și informații cruciale care permit ca documentul să poată fi legat de alte documente pentru a forma astfel hiperlink-uri (sau web-ul).”(sursa: Wikipedia)

HTML detine un format text alcatuit special pentru a putea fi citit și editat de oameni folosind un editor de text simplu. Scrierea și modificarea paginilor paginilor utilizand acest limbaj solicită totusi cunoștințe solide de HTML și este consumatoare de timp. Editoarele grafice (de tip WYSIWYG) cum ar fi Macromedia Dreamweaver, Adobe GoLive sau Microsoft FrontPage permit ofera utilizatorului posibilitatea de a crea pagini web asemănător cu documetele Word.

O pagina HTML este formata din mai multe elemente esențiale. În primul rând este vorba despre tag-ul <html></html>raspunzator de incadrarea limbajul în sine. Altedoua părți componente nelipsite sunt <head></head> și <body></body>

Tag-ului head cuprinde și <title></title> , unde se va scrie titlul ce va aparărea în partea de sus a browserului, deasenebea pot fi deschise legături către pagini ce conțin javascript/css, sau chiar scris cod de javascript și css în cadrul tagurilor respective celor 2 limbaje.

Principalele elemente ce intră în alcătuirea unei pagini HTML fiind excluse cele de baza, prezentate mai sus, sunt cele de heading: <h1></h1> , … , <h6></h6>Acestea impart pagina în diviziuni: <div></div>, <span></span>, Exista și elemente ce contribuie la stil și la așezarea în pagină: <br /> (rănd nou) , <b></b>(bold), <u></u>(subliniat) sau <i></i>(scris italic).taguri de HTML referitoare la paragrafe: <p></p>, liste <ul></ul> (listă neordonată) și <ol></ol> (listă ordonată), cel de tabel <table></table>, care conține taguri pentru titluri: <th></th>, linii :<tr></tr>, sau coloane: </td>.

Tagul <form></form este cel mai important și conține 2 secțiuni, cea cu ajutorul careia utilizatorul trimite informația: input, care poate fi de tipul: text, parolă, buton, checkbox, buton radio, imagine etc, și cea responsabila cu partea de submit.

2.9.2 CSS

Denumirea de CSS vine din limba engleză de la cascading style sheets.Acesta se poate traduce ca foi de stil în cascada, stiluri ce pot fi definite atât în headerul unei pagini web, cât și într-un fi și er separat individual. Cea de-a doua varianta fiind cea preferabilă.

CSS este folosit de utilizatori pentru a defini culori, fonturi, layout, precum și alte aspecte legate de prezentarea documentelor. Acesta este conceput în primul rând pentru a permite separarea documentului ca și conținut (HTML) de documentul de prezentare (scris în CSS).

Această separare îmbunatateste accesibilitatea conținutului, în plus oferind o mai mare flexibilitate și diminuare a caietul de sarcini al celui care se ocupa de mentenanța unui site web prin asigurarea unui control mai simplu. CSS-ul poate reduce complexitatea și repetarea tag-urilor folosite pentru formatare din structura conținutului. Acesta permite ca aceea și paginăsă fie prezentată în diferite stiluri de redare inf unctie de diferite medii.

Marea majoritate a programatorilor WEB considera CSS ca fiind un mod de formatare mult mai puternic și mai ușor de utilizat, și considera ca tag-ul <font> este învechit. Însa în 2006, capacitățile CSS-ului au fost îmbunătățite în mod semnificativ în ceea ce privește design-ul layoutului unei pagini web. Cu toate acestea, multe website-uri încă utilizează CSS numai pentru formatarea textului, în timp ce pentru layout preferă tabelele. Deoarece Internetul este din ce în ce mai folosit, fapt ce se datoreaza și utilizării tot mai frecvente a telefoanelor mobile, este necesară crearea unor pagini web care folosesc o mare varietate de dispozitive, iar CSS ajută foarte mult în aceasta privință, un design web fără tabele îmbunătățește considerabil accesibilitatea.

Limbajul CSS detine o sintaxa foarte simpla, fiind formată din trei elemente:selector, proprietate și valoare.

De exemplu: selector { proprietate:valoare; }

CSS suportă un număr mare de tipuri de reguli care se aplică elementelor, cele mai utilizate fiind:

Color: foreground color, utilizat pentr schimbarea culorii textului din elemental specificat

Background – responsabil pentru schimbarea fundalului unui element,; acesta are mai multe trăsături ce pot fi stilizate (background-color, background-image, background-position, background-repeat)

Position (relative, fixed, absolute) : folosind aceasta caracteristica se obține o așezare în pagină foarte precisă, folosindu-ne de trăsăturile: left, right, top, bottom ale lui position putem obține poziții de o acuratețe ridicată

Float ( left, right, center ) : caracteristică se folosită pentru poziționarea diferitelor structuri HTML în pagină. Float insa are un mod de funcționare prestabilit și aduce o așezare a obiectelor unele fața de altele, și nu fața de pagina HTML în sine.

Margin, padding, order detin roluri esențiale în definirea unui tabel, dar și a întregii pagini HTML.

Width și height , sunt folosite pentru a e stabilii lățimea și lungimea , fiind o caracterista esentiala în postarea pe pagină a pozelor, listelor ce intră în componența meniurilor, tabelelor propriu-zise, sau care definesc layoutul unei pagini. Aceste trăsături pot fi folosiți fie dăndu-li-se valori într-un anumit număr de pixeli, fie prin a folosii procente.

Text-transform, text-decoration, text-align, text-shadow sunt trăsături create pentru acoperirea intregii game de stiluri pe care un text o poate avea.

Cu ajutorul tagurilor HTML id și class se face referire la o anumită zona a paginii web, ce urmeazăsă fie stilizată intr-un fi și er separat. Când în cadrul paginii CSS se face referire la o bucată html a cărei legătura s-a realizat prin id, înaintea numelui id-ului se scrie semnul #, iar când legătura se realizeaza prin clasă, atunci înaintea selectorului se pune un punct.

Exemplu de cod CSS folosit în aplicatie:

#my_table_categories {

border-spacing: inherit;

width: 150px;

position: relative;

top: -50px;

margin-left: 20px;

border-radius: 5px;

border-color: #f24537;

color: white;

}

2.9.3 Javascript

Javascript este un limbaj de  programare folosit pentru a face posibil ca paginile web să fie mai interactive. Cel mai des este recunoscut ca facând parte din categoria "Scripting Languages"fiind lansat sub numele de  "LiveScript".Schimbarea numelui în JavaScript a fost un element legat de  strategia de marketing.
        Scripturile  Javascript sunt introduse în pagina HTML fiind interpretate și executate cu ajutorul unui browser. Limbajul Javascript este considerat o unealtă foarte bună în cazul în care utilizatorul doreste să controleze conținutul paginilor în funcție de data, ora, sistemul de operare sau browserul utilizatorilor,să facă site-uri interactive, care să comunice cu vizitatorii, site-uri dinamice,să valideze date primite din formulare, toate acestea fiind doar cateva exemple din posibilitațile pe care le oferă acest limbaj.

3. Prezentarea aplicației

Fiind o aplicație cloud-based accesarea acesteia este posibilă de oriunde si oricând.În momentul accesării aplicației, utilizatorul este redirecționat catre pagina de autentificare.

În cayul in care acesta nu deține un cont de înregistrare își poate crea unul cu ajutorul paginii Register. Utilizatorul va trebui sa isi aleagă o parola și un nume de utilizator.

Angajat

Sistemul va fi cu mult fluidizat. Utilizând aceasta aplicație orice anagajat va avea acces mult mai usor catre trimiterea unei cereri de concediu,si monitorizarea acesteia. Astfel este economisit timp, iar managementul procedurii este fluidizat. Având acces catre lista de proiecte asignate la momentul respectiv, atât angajatul cât si superiorii săi pot lua decizii cu un cost de impact minim.

Team Leader

Team Leader-ul va fi primul dintre superiori ce va primii cererile de concediu trimise de angajatți. Acesta are dreptul de a le accepta si astfel cererile ajung mai departe la CEO sau de a le refuya. Toate aceste deciyii sunt luate in funție de proiectele asignate si de numarul de angajati necesari disponibili pentru a duce la bun sfarșit un proiect.

CEO

CEO-ul are dreptul de a introduce proiecte noi, pe care mai departe team leader+ul le va asigna angajaților. Acesta va aproba sau nu cererile primite de la angajati , dar nu mai pe cele acceptate în prealabil de catre team leader in functie de proictele active.

Contabil

Contabilul va avea acces la toate cererile de concediu aprobate. El poate descarca un raport, astfel zilele de concediul ramase precum si procedura specifica partii contabile fiind mult mai ușor monitorizate. Deasemenea contabilul poate completa cereri de concediu.

Bibliografie:

Pro Asp.NET MVC 4, Adam Freeman

Beginning ASP.NET MVC 4, Jose Galloway

Fundamentals of Computer Programming with C#, Svetlin Nakov

Programming C# for Beginners, Mahes Chand

http://www.microsoftvirtualacademy.com

http://www.w3schools.com/css

Fundamentals of Azure, Michael Collier

Implementing Microsoft Azure Infrastructure and Solutions, Exam Ref 70-533

Developing Microsoft Azure Solutions, Exam Ref 70-532

http://ro.wikipedia.org/wiki/Cascading_Style_Sheets

https://technet.microsoft.com/en-us/

https://www.microsoftvirtualacademy.com/en-us/training-courses/introduction-to-asp-net-mvc-8322

Limbajul C# pentru incepatori – vol 6: Mediul de programare Visual Studio – Liviu Negrescu

Tehnici De Design Html, CHIP

http://ro.wikipedia.org/wiki/HyperText_Markup_Language

Bibliografie:

Pro Asp.NET MVC 4, Adam Freeman

Beginning ASP.NET MVC 4, Jose Galloway

Fundamentals of Computer Programming with C#, Svetlin Nakov

Programming C# for Beginners, Mahes Chand

http://www.microsoftvirtualacademy.com

http://www.w3schools.com/css

Fundamentals of Azure, Michael Collier

Implementing Microsoft Azure Infrastructure and Solutions, Exam Ref 70-533

Developing Microsoft Azure Solutions, Exam Ref 70-532

http://ro.wikipedia.org/wiki/Cascading_Style_Sheets

https://technet.microsoft.com/en-us/

https://www.microsoftvirtualacademy.com/en-us/training-courses/introduction-to-asp-net-mvc-8322

Limbajul C# pentru incepatori – vol 6: Mediul de programare Visual Studio – Liviu Negrescu

Tehnici De Design Html, CHIP

http://ro.wikipedia.org/wiki/HyperText_Markup_Language

Similar Posts

  • Elaborarea Unei Aplicatii Demonstrative “metode Clasice DE Ciptare”

    TEZA DE LICENȚĂ ELABORAREA UNEI APLICAȚII DEMONSTRATIVE “METODE CLASICE DE CIPTARE” CUPRINS ADNOTARE ABSTRACT АННОТАЦИЯ LISTA ABREVIERILOR INTRODUCERE 1. EVOLIȚIA SISTEMELOR DE CRIPTARE 1.1 Necesitatea aplicării metodelor criptografice 1.2 Scurt istoric al evoluției metodelor de criptare 1.3 Metode clasice de criptare 1.3.1 Cifrul Cezar 1.3.2 Cifrul Affin 1.3.3 Cifrul Vigenere 1.3.4 Cifrul Polybios 1.3.5 Cifrul…

  • . Sistem Informatic Pentru Contabilitatea Financiara

    CUPRINS Cap. I ÎNTREPRINDEREA- LOCUL ȘI ROLUL INFORMAȚIONAL I.1 Dezvoltarea tehnicii de calcul și creșterea nevoii de informații I.2 Sistemul informațional și Întreprinderea I.3 Contabilitatea și sistemul informațional al întreprinderii I.3.1 Introducere în problemațica contabilității I.3.2 Contabilitatea financiară în România I.3.3 Perspective în dezvoltarea contabilității in România I.3.4 Sistemul informațional contabil I.4 Necesitatea automatizării fluxurilor…

  • Sistem Informatic Pentru Un Cabinet Medical

    Introducere Fenomen de amploare mondială, Internetul cunoaște o evoluție incomparabilă cu cea a altor instrumente media, la dezvoltarea sa continua participând întreg mapamondul. El se extinde cu o viteză fantastică, tot mai mulți utilizatori se conectează zilnic la Internet avizi de informație. Dacă la începuturile acestui fenomen ajuns acum la scara planetară, lumea nu își…

  • Gestiunea Unei Biblioteci Virtuale In Sql

    LUCRARE DE LICENȚĂ GESTIUNEA UNEI BIBLIOTECI VIRTUALE ÎN SQL Contents Abreviar INTRODUCERE CAPITOLUL 1 PREZENTAREA BIBLIOTECII ȘI ANALIZA PROCESELOR DE GESTIUNE 1.1 Prezentarea bibliotecii 1.1.1 Misiunea și viziunea 1.1.2 Scurt istoric 1.2 Analiza procesului de informatizare 1.2.1 Dotarea în trecut 1.2.2 Dotarea în prezent CAPITOLUL 2 TEHNOLOGII INFORMATICE FOLOSITE PENTRU GESTIUNEA CĂRȚILOR DINTR-O BIBIOTECĂ 2.1…

  • Portal Băile Felix

    Cuprins 1.Introducere…………………………………………………………………………………..4 2. Fundamentare teoretica……………………………………………………………………..6 2.1 Baze de date .……………………………………………………………………………7 2.1.1 Tipuri de date în MySQL…………………………………………………………7 2.1.2 Crearea unei tabele în baza de date……………………………………………….7 2.1.3 Inserarea datelor în baza de date………………………………………………….7 2.1.4 Modificarea tabelelor……………………………………………………………..8 2.1.5 Ștergerea de înregistrări din baza de date…………………………………………8 2.1.7 Ștergerea unei baze de date……………………………………………………….8 2.2 Aplicatii web……………………………………………………………………………8 3. Tehnologii utilizate…………………………………………………………………………11 3.1…