Specializarea Informatic ă [631526]
Universitatea din Pite ști
Facultatea de Matematic ă-Informatic ă
Specializarea Informatic ă
LUCRARE DE LICEN ȚĂ
Coordonator,
Lector univ. dr. P ăun Viorel
Absolvent: [anonimizat]
2015
2Dezvoltarea unui sistem de licita ții on-line
3Cuprins
1.MySQL……………………………………………………………………………………………………………………………………..5
1.1 Istoria MySQL…………………………………………………………………………………………………………………….. 5
1.2 Elemente de baz ă………………………………………………………………………………………………………………..8
1.3 Conectarea bazei de date prin Entity Framework …………………………………………………………………… 9
1.3.1 Adăugarea unui nou Data Source ………………………………………………………………………………….15
1.3.2 Utilizarea Data Source într-un Windows Form ………………………………………………………………..19
1.4 Compararea sistemelor de gestiune a bazelor de date MySQL și Oracle…………………………………..24
1.4.1 Beneficiile MySQL și Oracle…………………………………………………………………………………………..25
2. ASP.NET și Entity Framework……………………………………………………………………………………………………27
2.1 Istoric ………………………………………………………………………………………………………………………………27
2.2 ASP.NET MVC Framework…………………………………………………………………………………………………..28
2.3 Compararea versiunilor de .NET Framework…………………………………………………………………………30
2.3.1 .NET Framework 1.0…………………………………………………………………………………………………….30
2.3.2 .NET Framework 1.1…………………………………………………………………………………………………….30
2.3.3 .NET Framework 2.0…………………………………………………………………………………………………….31
2.3.4 .NET Framework 3.0…………………………………………………………………………………………………….32
2.3.5 .NET Framework 3.5…………………………………………………………………………………………………….32
2.3.6 .NET Framework 4.0…………………………………………………………………………………………………….33
2.3.7.NET Framework 4.5 ……………………………………………………………………………………………………33
2.3.8 .NET Framework 4.5.1………………………………………………………………………………………………….35
2.3.9 .NET Framework 4.5.2………………………………………………………………………………………………….35
2.4 Contrast între Entity Framework si NHibernate ………………………………………………………………..35
2.5 Framework-ul Bootstrap- HTML, CSS, JAVAScript ………………………………………………………………….38
XHTML 1.0 ……………………………………………………………………………………………………………………….41
3.Descriea aplica ției ……………………………………………………………………………………………………………………43
ANEXE……………………………………………………………………………………………………………………………………….49
4INTRODUCERE
Internetul este tot mai accesibil în zilele noastre, atât pe laptop-uri, PC-uri cât și pe
tablete și pe cele mai indispensabile gageturi, din punctul meu de vedere, smartphone-
urile. Dar pe cat de indispensabile sunt smartphone-urile pe atât de mult suntem
dependen ți de ultimele tehnologii ap ărute și desigur, dorim s ă le achiziționam la un pre ț
cat mai mic. Și de aici, apar vânz ările second-hand care sunt mult mai bine promovate pe
internet cu ajutorul unei aplica ții sau sistem bine configurat, cu o varia ție destul de mare
de produse si de utilizatori.
Am ales impreun ă cu coordonatorul meu științific Lector univ. dr. P ăun Viorel
această temă pentru lucrarea de licen ță în scopul de a dezvolta un sistem de licita ții on-
line, ușor de utilizat, intuitiv și accesibil oricui. Mi-am propus s ă realizez acest site intr-
un mod destul de sigur, utilizând tehnologii cunoscute și de ultim ă generație. Am ales sa
folosesc MySQL pentru baza de date, ASP.NET pentru func ționalitatea sistemului de
licitații on-line folosind structura arhitectural ă MVC 5 (Model-View-Controller),
conectarea și lucrul cu baza de date realizat ă cu Entity Framework, iar design-ul
sistemului de licita ții cu Bootstrap.
51.MySQL
“MySQL este un sistem de gestiune a bazelor de date, produs de compania suedez ă
MySQL AB, fiind, la ora actual ă, cel mai popular sistem de acest fel. MySQL este utilizat
pe scară largă fiind, probabil, cea mai folosit ă bază de date din lume, cu un num ăr de
instalări estimat la 20 de milioane, aceasta a exercitat o presiune uria șă asupra Oracle,
datorită abordării sale cu surse deschise, fiind poten țial gratuit pentru multe scopuri și
chiar contra cost pentru diferite licen țe sau oferte premium.
MySQL a fost vândut de Monty Widenius, în 2008, firmei Sun. Sun, la rândul s ău, a fost
cumpărată de Oracle. Pe internet a ap ărut, în luna ianuarie 2010, o peti ție (închisă acum)
împotriva achizi ției MySQL de c ătre Oracle, semnat ă de peste 50.000 de persoane.
Deși Comisia European ă și-a exprimat îngrijorarea cu privire la controlul total al Oracle
asupra codului surs ă și asupra drepturilor de proprietate intelectual ă privind baza de date MySQL
a companiei Sun, la sfâr șitul lunii ianuarie aceea și Comisie a decis c ă grupul Oracle poate
achiziționa Sun Microsystems, f ără să i se pună condiții și fără să existe riscul de a se creea un
monopol pe pia ță. Comisia European ă a ajuns la concluzia c ă, indiferent dac ă Oracle va limita
poziția MySQL ca produs open-source, alte baze de date open source ar putea ocupa locul l ăsat
liber. Regulatorii europeni au numit baza de date open source PostgreSQL, considerat ă de mulți
a fi o alternativ ă viabilă la MySQL.
1.1 Istoria MySQL
MySQL este disponibil în mod public din 1996, dar istoria dezvolt ării sale începe înc ă
din 1979. MySQL poate fi folosit atât pe platforme Windows, cât și Unix, iar codului surs ă i se
pot aduce modific ări și poate fi redistribuit gratuit.
Serverul de baze de date al MySQL a fost în mod tradi țional un produs dezvoltat și
menținut de o singur ă companie, nu un proiect al comunit ății, depinzând de voluntari sau de
furnizori multiplii (precum Linux). De fiecare dat ă când cineva dezvolta îmbun ătățiri importante,
compania din spatele MySQL se asigura (printr-o delegare a drepturilor de autor) c ă are dreptul
să foloseasc ă acele îmbun ătățiri nu doar sub GPL (General Public License), ci și sub alte licen țe.
Această abordare a permis MySQL s ă-și implementeze modelul de afaceri de mare
succes bazat pe licen ța dublă. Cei care au dorit s ă încorporeze codul MySQL în alte proiecte sub
GPL au fost liberi s ă o facă. Cei care au dorit s ă-l încorporeze sau s ă îi aducă îmbunătățiri în
produse cu sursele închise, f ără a fi nevoi ți să-și publice întregul produs derivat sub termenii
GPL (ceea ce, practic, i-ar priva de mai multe oportunit ăți comerciale) puteau cump ăra, opțional,
o licență comercial ă (program identic, dar cu drepturi și obligații diferite).
6Nu doar afacerea bazat ă pe licența dublă a depins de principiul acesta, ci și creșterea
rapidă a afacerii bazat ă pe abonarea la „MySQL Enterprise”. Aceasta este compus ă din trei tipuri
de componente: MySQL (oricum disponibil sub GPL), servicii (care se pot cump ăra și separat,
inclusiv de la p ărți terțe) și instrumente.
MySQL a fost dezvoltat ini țial de MySQL AB și, în ultimii șapte ani, de Sun
Microsystems, compania cu cele mai mari contribu ții la programe libere (limbajul Java, suita de
birou OpenOffice.org, sistemul OpenSolaris, sistemul de virtualizare VirtualBox, sistemul GNU,
nucleul Linux).
Fondatorul MySQL, Monty Widenius, cerea, la începutul anului 2010, sus ținerea
comunității open source în fa ța planului Oracle de a limita suportul MySQL. Widenius era
supărat că Oracle a contactat sute de clien ți mari care au trimis Comisiei Europene scrisori prin
care cereau aprobarea necondi ționată a tranzac ției. Oracle ar fi promis clien ților săi că va finanța
dezvoltarea MySQL cu mai mul ți bani decât ar fi f ăcut-o Sun și că, dacă va abandona vreodat ă
sistemul, va ap ărea o nouă linie de dezvoltare care va continua aceast ă activitate.
Succesul MySQL a depins întodeauna de compania din spatele s ău, care a dezvoltat, a
vândut și a promovat MySQL. Compania (ini țial MySQL AB, apoi Sun) a de ținut întotdeauna
importantele drepturi de proprietate intelectual ă (DPI-drepturi de proprietate intelectul ă), cele
mai notabile fiind marca înregistrat ă, drepturile de autor și brevetele (pân ă acum doar în scopuri
defensive). A folosit DPI pentru a genera venituri și a reinvestit o mare parte din ele în
dezvoltare, MySQL devenind nu doar un program mai mare, ci și unul mai bun cu timpul.
Creatorii peti ției scriau c ă „dacă aceste DPI cad în mâna competitorului principal al
MySQL, atunci MySQL înceteaz ă imediat s ă mai fie o alternativ ă pentru produsele foarte
scumpe ale Oracle. Pân ă acum, clien ții au avut posibilitatea de a folosi MySQL în loc de
produsele Oracle în noile lor proiecte. Câteva companii mari chiar au migrat de la Oracle la
MySQL. Oricine putea amenin ța oamenii de vânz ări ai Oracle cu folosirea MySQL, în cazul în
care nu i se acorda o reducere mare. Dac ă Oracle va de ține MySQL, oamenii de vânz ări în mod
sigur vor râde când clien ții vor mai încerca aceast ă tactică. Scăparea de aceast ă problemă
valorează pe puțin 1 miliard de dolari pe an pentru Oracle”.
Dacă acum cincisprezece ani MySQL era o baz ă de date de slab ă calitate, care mergea
totuși foarte bine pentru „web” și pentru alte scopuri unde se cere numai citirea sau mai mult
citirea datelor, în timp lucrurile s-au schimbat. Iar în ultimii ani, a devenit din ce în ce mai
popular ca alternativ ă pentru reducerea costurilor în marile inteprinderi și în organiza țiile
guvernamentale. A urcat din mediul privat și departamental de dimensiuni reduse în mediul
proiectelor de referin ță al unor organiza ții mari ca Google, Facebook, ebay, Poli ția Suedez ă,
bănci, linii aeriene.
Desigur, Oracle ofer ă un număr de funcționalități pe care MySQL nu le are azi, dintre
care pe unele probabil nici nu o s ă le aibă în decursul urm ătorilor ani. Cu toate acestea, din ce în
ce mai mul ți programatori g ăsesc că MySQL ofer ă o mare parte din lucrurile de care chiar au
nevoie, inclusiv func ționalități de „intreprindere”, mai spun cei din comunitatea open source.
7Iată ce spune, îns ă, un angajat al Oracle pe un forum, subliniind c ă vorbește în nume
personal și nu ca angajat al Oracle, fiind utilizator și cunoscător al mai multor baze de date, de
peste 20 de ani: „Cine spune c ă MySQL este competitor pentru Oracle are o p ărere… hmm..
interesant ă. E ca și cum ai compara Bugatti Veyron/Ferrari Enzo/o ma șină de Formula 1 cu…
nici nu știu ce să zic să fie compara ția adecvat ă… Tata Nano? S ă compari din punct de vedere
features/performan țe/stabilitate baza de date care e op țiunea num ărul 1 a băncilor, organiza țiilor
financiare, organiza țiilor din sectoarele publice ș.a.m.d. cu «op țiunea nr. 1» a webmasterilor
pentru forumuri… da, e posibil… pot s ă aibă cam acela și «market share» în segmentele lor… dar e
comparația adecvat ă? Locul lui MySQL nu a fost și nici nu va fi niciodat ă în segmentul
enterprise. Și banii, să fim serio și, de aici vin, și nu de la «forumi ști»”.
Monty Widenius, prin compania proprie Monty Program Ab, împreun ă cu Percona, o alt ă
companie care oferea servicii și suport pentru MySQL, au anun țat că vor forma un consor țiu
neutru, „The Open Database Alliance” cu scopul de a deveni un centru de resurse pentru
MySQL. Acesta se va baza pe propria ramur ă MySQL dezvoltat ă de Widenius, cu cod derivat,
binare, cursuri, suport și îmbunătățiri proprii, toate sub marca MariaDB: „MariaDB va lucra
exact ca MySQL. Toate comenzile, interfe țele și API care exist ă în MySQL sunt și în MariaDB”,
declară Widenius.
MariaDB va include motoarele de stocare Maria DBMS și Prime XT, iar conform
declarațiilor lui Widenius, va avea mai pu ține erori, o linie de testare mai bun ă, performan țe
ridicate, toate acestea fiind comparate cu versiunea Sun a MySQL 5.1, pe care acesta a declarat-o
în mod public inutilizabil ă în mediul de produc ție, astfel, MariaDB și Open Database Alliance
pretându-se și fiind alternativa cea mai potrivit ă ca variant ă derivată a MySQL.
Această variantă poate fi amenin țată în orice stadiu al dezvolt ării de brevetele lui
MySQL, dac ă acestea sunt achizi ționate de Oracle.
80-85% din site-uri livreaz ă conținutul prin intermediul unei baze de date MySQL.
Conform unui sondaj realizat de 451Group, în momentul de fa ță 82,1% din cei chestiona ți
utilizează MySQL. În 2011 acest procent a sc ăzut la 78,7%, iar în 2014 la 72,3%.”
Conform Articolului din 24 iunie 2010[Nr. 126] “MySQL- o baz ă de date cu “ mo ștenitori“ al
Revistei Market Watch
81.2 Elemente de baz ă
Bazele de date sunt folosite pentru stocarea informa țiilor in vederea furniz ării ulterioare in
funcție de solicitarea primit ă.
MySQL este un sistem de baze de date func țional independent.
ÎnPHP există funcții pentru toate opera țiile executate asupra bazelor de date MySQL.
Administrarea MySQL se poate face din linie de comand ă, folosind browser-ul si
accesând aplica ția numităPHPMyAdmin scrisă în PHP sau prin clien ți cum ar fi HeidiSQL.
Cele mai uzuale opera ții cu bazele de date sunt:
ComandăSemnifica ție
CREATE crează o bază de date sau un table
DROP șterge o baza de date sau un table
INSERT adaugă inregistrări intr-un table
DELETE șterge inregistr ări dintr-un table
UPDATE updatează inregistrările dintr-un tabel
SELECT selectează un table
ALTER alterarea unui table
În MySQL spa țiul alocat pe discul server-ului este în func ție de tipul de date. Câteva din
tipurile de date folosite în bazele de date MySQL sunt:
Tip Semnifica ție
int() număr intreg 32 biți
bigint() număr intreg 64 biți
tinyint() număr intreg (-128 la 127 sau 0 la 255) 8 biți
mediumint() număr intreg 24 biți
smallint() număr intreg 16 biți
char() secțiune cu lungime fix ă de la 0 la 255 caractere
varchar() secțiune cu lungime variabil ă de la 0 la 255 caractere
float() număr mic cu virgula flotant ă
Double număr mare cu virgula flotant ă
Text șir cu maximum 65535 caractere
9date() data în format YYYY-MM-DD
Date data în format YYYY-MM-DD HH:MM:SS
Time ora în format HH:MM:SS
Pentru ca baza de date s ă fucționeze mai bine, coloanelor li s-au ad ăugat modific ători de
coloană. Tipul de date intregi încep de la valori negative la pozitive. Dac ă se adaugă optiunea
UNSIGNED , care este un modificator de coloan ă, nu vor mai fi valori negative ci vor incepe de
la 0.
Alți modificatori sunt:
AUTO_INCREMENT funcționează cu orice tip întreg. La fiecare rând nou ad ăugat în baza de
date numărul asociat va fi incrementat.
NULL inseamnă fără valoare (diferit de spa țiu sau zero).
NOT NULL înseamna c ă orice inregistrare va fi considerat ă ceva.
PRIMARY KEY este rolul primei coloane din tabel, totodat ă reprezentând elementul de
referință pentru fiecare linie.
FOREIGN KEY reprezintă o legătură între dou ă tabele. Cu ajutorul ei se pot creea
legături de tipul ONE TO ONE, ONE TO MANY și MANY TO MANY.
1.3 Conectarea bazei de date prin Entity Framework
Primul pas este de a creea un nou proiect Windows Forms.
În Visual Studio, selecta ți File, New Project din meniul principal.
Se alegeșablonul instalat Windows Forms Application. Se apas ă pe butonul OK. Solu ția
este creată.
Adaugarea unui Entity Data Model
Se adaugăun Entity Data Model pentru solu ție.
În Solution Explorer, se face clic dreapta pe aplica ție și se selectaeaz ăAdăugare, New
Item …. Pentru șabloanele instalate Visual Studio se selecteaz ăADO.NET Entity Data
Model. Se apas ăclic pe Ad ăugare.
10Adăugare Entity Data Model
Va apărea un Entity Data Model Wizard. Se foloseste Wizard pentru a genera Entity Data
Model din baza de date. Se selecteaz ă pictograma Generate din baza de date. Se face clic pe
Next.
11Entity Data Model Wizard (1)
Acum se poate selecta conexiunea facut ă mai devreme în baza de date. Dac ă nu este făcut
deja acest lucru, se poate creea noua conexiune în acest moment, ap ăsand clic New Connection.
12Entity Data Model Wizard (2)
Se noteaz ăsetările de conectare la entitate pentru a fi utilizate în App.Config, deoarece
acestea vor fi folosite mai târziu pentru a scrie codul de control necesar.
Se apasăclic pe butonul Next.
Entity Data Model Wizard se conecteaz ă la baza de date. Este prezentat ă cu o structur ă
arborescent ă baza de date. Din aceasta pute ți se poate selecta obiectul sau obiectele pe care dori ți
să le include ți în modelul dumneavoastr ă. Dacă s-ar fi creat Vizualiz ări și Proceduri stocate
13acestea vor fi afi șate împreun ă cu orice tabele. În acest exemplu, trebuie doar s ă se selecteze
tabele. Se face clic pe Finish pentru a crea modelul și a ieși din Wizard.
Entity Data Model Wizard (3)
Visual Studio va genera modelul și apoi afișarea.
14Entity Data Model Diagram
Din Visual Studio meniul principal, se selecteaz ăBuild, Build Solution, pentru a se
asigura că totul compileaz ă corect pân ă acum.
151.3.1 Adăugarea unui nou Data Source
Se adaugăun Data Source la proiect și se poate vedea cum poate fi folosit pentru a citi și
scrie în baza de date.
Din meniul principal se selecteaz ăData, Add New Data Source…Vor fi prezentate cu
Data Source Configuration Wizard.
Entity Data Source Configuration Wizard (1)
Se selecteaz ăpictograma Object. Face ți clic pe Next.
16Se selecteaz ă acum obiectul la care se dore ște legătura. Se extinde meniul arbore. În acest
tutorial, se selecteaz ătabelul ora ș. După ce tabelul ora ș a fost selectat se face clic pe Next.
Entity Data Source Configuration Wizard Screen (2)
17Wizard va confirma c ă este obiectul ora ș care urmeaz ă săfie adăugat. Se face clic pe
Finish.
Entity Data Source Configuration Wizard (3)
18Obiectul ora ș va fi afișat pe panoul Data Source. Dac ă panoul Data Source nu este afi șat,
se selecteaz ăData, Afișare Data Source din meniul principal Visual Studio. Panoul andocat va fi
afișat.
Data Sources
191.3.2 Utilizarea Data Source într-un Windows Form
În panoul Data Source, se selecteaz ă Data Source care tocmai s-a creat și se execut ă
glisarea elementului in Form Design. În mod implicit obiectul Data Source va fi ad ăugat ca un
control de Data Grid View.
Data Form Designer
Se salveaz ăși se reconstruie ște soluția înainte de a continua.
20Adăugarea Codul pentru a popula Data Grid View
Acum se ad ăugăcodul pentru a se asigura c ă controlul Data Grid View va fi populat cu
datele din tabelul bazei de date Ora ș.
Se apasă Dublu-clic pe formular pentru a accesa codul.
Se adaugă codul de instan țiere Entity Data Model's EntityContainer ca obiect pentru a
prelua din baza de date si pentru a popula re țeaua.
Adăugarea codului pentru Form
Se salveaz ăși se reconstruie ște soluția.
21Se rulează soluția. Se asigur ăcărețeaua este populat ă și se poate naviga în baza de date.
Baza de date populat ă
Adăugarea Codul pentru a salva modific ările la baza de date
Se adaugă cod pentru a permite salvarea modific ărilor în baza de date.
Componenta sursa Binding asigur ă ca modific ările făcute în controlul Data Grid View
sunt, de asemenea, f ăcute pentru clasele entit ăților. Cu toate acestea, datele sunt salvate înapoi de
la entități la baza de date în sine. Acest lucru poate fi realizat prin puterea dat ă de butonul
Salvare în controlul Navigator, iar acesta ad ăugă cod.
22În Form Designer, se face clic pe pictograma Save din bara de instrumente Form s ă se
asigure că proprietatea Enabled este setat ă la Adevărat.
Butonul Save activat
Se apasăDublu-clic pe pictograma Save din bara de instrumente Form pentru a afi șa
codul.
23Acum trebuie s ă se adauge codul pentru a se asigura c ă datele sunt salvate în baza de date
atunci când butonul Save este ap ăsat la cerere.
Adăugarea Salv ării Codului de Form
Odată ce codul a fost ad ăugat, se salveaz ăși se reconstituie solu ția. Se reia aplica ția și se
verificădacă modificările efectuate în re țea sunt salvate.
241.4 Compararea sistemelor de gestiune a bazelor de date
MySQL și Oracle
Diferențele majore constatate atunci când ne uit ăm la MySQL în raport cu Oracle începe
cu sistemele de operare cu care lucreaz ă. MySQL func ționează cu: Windows, Mac OS X, Linux,
UNIX, z/OS, BSD, Symbian, AmigaOS, în timp ce Oracle func ționează doar cu: Windows, Mac
OS X, Linux, UNIX, z/OS.
O altă diferență majoră sunt indicii folosi ți de ambele. MySQL foloseste: Full-text, Hash,
R-/R+ Tree, în timp ce Oracle îi folose ște pe aceștia trei plus: Bitmap, Expression, Partial și
Reverse.
Alte diferen țe majore includ:
MySQL sprijin ă Java, în timp ce Oracle nu
MySQL ofer ă siportpentru site și telefon, în timp ce Oracle ofer ă doar suport Forum
Oracle func ționează cu ambele sisteme dinamice și statice, în timp ce MySQL
funcționează numai cu static
MySQL este gratuit, în timp ce pre țul Oracle începe de la 180 dolari
Alte diferen țe se constat ă între cele dou ă, de asemenea, dar aceste diferen țe sunt cele mai
evidente.
251.4.1 Beneficiile MySQL și Oracle
Ambele sisteme de baze de date ofer ă multe beneficii și ambele sunt extrem de populare.
Beneficiile MySQL includ:
Libertatea de folosire
Performan țe foarte bune
Foarte ușor de folosit
Securitate incredibil ă
Scalabil
Funcționează cu multe sisteme de operare
Suporta multe interfe țe de dezvoltare
Beneficiile Oracle includ:
Capabil de a rula ILTB mari și VLDBs
Foarte bogat de caracteristici
Extrem de fiabil
Tehnologia Flashback
Toate aceste beneficii face MySQL o alegere bun ă, în special pentru cei care caut ă un
sistem de baze de date gratuit.
26MySQL ofer ă un sistem de baze de date de mare vitez ă pentru proiecte mici si medii.
Cele mai multe companii folosesc MySQL deoarece caracteristicile în plus sau diferite pe care
Oracle le are, nu le sunt de folos deoarece ele folosesc func ționalitatea la nivel de mijloc.
Multe sisteme de management al con ținutului, cum ar fi WordPress, Joomla și Drupal,
folosesc baze de date MySQL. Ori de câte ori ave ți de gând s ă utilizați una dintre aceste op țiuni
CMS, vei folosi MySQL. De multe ori, aceste proiecte sunt pe o scar ă mai mică și MySQL ofer ă
cea mai bun ă alegere. Este gratuit, ofer ă o viteză foarte mare și este foarte prietenos si u șor de
folosit. Companii de pornire și companii mai mici se potrivesc cel mai bine cu MySQL. Aceasta
poate include, de asemenea bloguri și celor care inten ționează să construiasc ă multe site-uri de
nișă.
Oracle este o alegere foarte popular în lista companiilor din Fortune 100 și pentru
întreprinderile mari. Ei exceleaz ă mai ales cu aplica ții de business mari si depozite mari de date.
Atunci când se uit ă la popularitatea MySQL in compara ție cu Oracle, este important s ă
rețineți că fiecare este folosit de cele mai multe ori. Oracle este folosit mai mult pentru
întreprinderile mari, în timp ce MySQL este folosit pentru proiecte mai mici si mijlocii.
Dintre cele dou ă, MySQL este cel mai popular (datorita studiilor de pia ță facute în ultimii
ani). Deoarece este folosit cu WordPress, care este cel mai popular sistem de management al
conținutului de blogging și de construc ție a site-urilor web, fiind utilizat mai des decât Oracle.
Cu toate acestea, pentru întreprinderile mari, Oracle este de departe cea mai popular ă
alegere. Chiar dac ă MySQL este folosit de site-uri mari, cum ar fi Facebook și YouTube, nu este
la fel de popular pentru întreprinderile mai mari ca și Oracle.
272. ASP.NET și Entity Framework
2.1 Istoric
ASP.NET este open-source, fiind un server cadru pentru Web. Acesta a fost dezvoltat de
Microsoft pentru a permite programatorilor s ă construiasc ă site-uri web dinamice, aplicatii web
si servicii web.
Acesta a fost lansat in ianuarie 2002, cu versiunea 1.0 a .NET Framework și este
succesorul Active Server Pages tehnologia Microsoft (ASP). ASP.NET este construit pe
Common Language Runtime (CLR), care permite programatorilor s ă scrie cod ASP.NET
folosind orice limbaj .NET suportat. Cadrul de extensie SOAP ASP.NET permite componente
ASP.NET pentru a procesa mesaje SOAP.
ASP.NET este în curs de a fi reimplementat ca un cadru web modern și modular,
împreună cu alte cadre, cum ar fi cadru Entity. Noul cadru va face uz de noul open-source .NET
Compiler platforma (nume de cod "Roslyn") și să fie cross-platform. ASP.NET MVC, ASP.NET
Web API (o platforma folosind doar paginile de Razor), vor fuziona într-un MVC unificat.
După patru ani de dezvoltare, precum și o serie de versiuni beta în 2000 și 2001,
ASP.NET 1.0 a fost lansat pe 05 ianuarie 2002, ca parte a versiunii 1.0 a .NET Framework.
Chiar înainte de lansare, zeci de carti au fost scrise despre ASP.NET, și Microsoft a promovat
puternic, ca parte a platformei sale pentru serviciile Web. Scott Guthrie a devenit manager de
productie pentru ASP.NET, iar dezvoltarea continu ă în același ritm, cu versiunea 1.1 care a fost
lansată pe 24 aprilie 2003, ca parte a Windows Server 2003. ASP.NET se bazeaza vag pe
HTML.
Paginile Web ASP.NET, cunoscut oficial ca Web Forms, sunt principalele pietre de
temelie pentru dezvoltarea de aplicatii in ASP.NET. Formularele Web sunt con ținute în fi șiere cu
extensia ".aspx". Aceste fi șiere conțin de obicei markup static (X) HTML, precum și markup
pentru definirea server-side-ului de control web si User Controls unde dezvoltatorii pun tot
conținutul de resurse pentru pagina Web. În plus, codul dinamic, care ruleaz ă pe server, poate fi
plasat într-o pagin ă, într-un bloc <% – cod dinamic -%>, care este similar cu alte tehnologii de
dezvoltare web, cum ar fi PHP, JSP, și ASP. Cu ASP.NET Framework 2.0. Microsoft a introdus
un nou model de cod în spatele caruia permite textului static s ă rămână pe pagina aspx, în timp
ce codul dinamic r ămâne într-un .aspx.vb sau .aspx.cs sau .aspx.fs fi șier în func ție pe limbajul de
programare utilizat.
282.2 ASP.NET MVC Framework
ASP.NET MVC este o aplicatie Web open-source care implementeaz ă modelul Model-
View-Controller (MVC).
Pattern-ul Model-View-Controller (MVC) separ ă o aplicație in trei componente
principale:
M: model (Model). Modelul con ține o mul țime de clase ce constituie datele cu care se
lucrează și regulile de interac țiune ale acestora.
V: vizualizare (View User Interface). View define ște cum va ar ăta interfața aplicației.
C: controler (Controller). Controller-ul con ține o mul țime de clase ce gestioneaz ă
comunica ția de la utilizator și logica specific ă aplicației.
În ASP.NET MVC acesta este translatat astfel:
Model: Con ține clase ce reprezint ă domeniul aplica ției. Aceste obiecte încapsuleaz ă
adesea date memorate într-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: View este un template pentru a genera în mod dinamic HTML.
Controller: Controller este o clasa special ă ce gestioneaz ă relațiile dintre View si Model.
Controller-ul raspunde la ac țiunile utilizatorului, comunic ă cu modelul și decide ce vizualizare
va afișa (daca exist ă una). În ASP.NET NVC, numele acestei clase con ține sufixul Controller .
Structura unei aplica ții ASP.NET MVC
Director Scop
/Controllers Con ține clasele pentru Controller ce gestioneaz ă cererile URL
/Models Con ține clasele ce reprezint ă datele modelului, gestionarea acestor obiecte.
/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 fișierele de date Read/Write.
/App_Start Con ține cod de configurare, grup ări de fișiere și Web API.
Entity Framwork
Bazele de date tind s ă reprezinte un r ău necesar în munca de zi cu zi a programatorilor.
Nevoia concrete de a persista datele într-un mod unitar și ușor i se opune migala necesar ă pentru
a scrie cod de management ale acestor date. Fie ca sunt numite "straturi de persisten ță", "unelte
29de relationare cu obiectele" sau "straturi de abstractizare date", acestea sunt menite s ă ofere
viteză si constant ă în procesul de dezvoltare a proiectelor de mari dimensiuni.
Cand Microsoft a anun țat release-ul unei noi tehnologii în domeniul ORM-urilor, "The
Entity Framework", a fost întampinat cu interes dar și cu o urma de scepticism din partea
comunitații de dezvoltatori. Prima reac ție a fost aceea de a compara aceast ă nouă unealtă cu cele
deja consacrate pe pia ță, precum NHibernate, LLBLGen și altele. De și în multe privin țe aria
acoperită coincide, nu trebuie pierdut din vedere c ă Entity Framework nu are scopul de a rezolva
aceleași probleme pe care le abordeaz ă celelalte produse. Nu exist ă o soluție perfectă în alegerea
uneltei potrivite. Aceasta se va eviden ția singură în funcție de cerintele proiectului.
Cadrul ASP.NET MVC este un cadru de prezentare u șor, ușor de testat, care este integrat
cu caracteristici ASP.NET existente. Unele dintre aceste caracteristici integrate sunt paginile de
master și de autentificare pe baza de membru. Cadrul MVC este definit în ansamblul
System.Web.Mvc.
În luna martie 2012, Scott Guthrie a anun țat pe blogul s ău că Microsoft a lansat o parte
din pachetul lor (inclusiv ASP.NET MVC, Razor și API Web) sub o licen ță open-source
(Apache License 2.0).
Guthrie a scris c ă "Acest lucru va permite un model de dezvoltare mai deschis ă, în care
toată lumea din comunitate va fi în m ăsură să se angajeze și să ofere feedback cu privire la
validarea codului, remedierea bug-urilor, noi caracteristici de dezvoltare, și de a construi și testa
produsele pe o baz ă de zi cu zi folosind versiuni care îmbunat ățesc codul surs ă și testele. "
Motoare de vedere
Motoarele de vedere utilizate in ASP.NET MVC 3 și MVC 4 Frameworks sunt motorul
de vedere Razor și motorul de vedere Web Forms. Ambele fac parte din MVC 3 Framework. În
mod implicit, motoarele de vedere în MVC folose șeste Razor .cshtml și .vbhtml sau pagini de
formulare web aspx pentru a proiecta aspectul paginilor de interfa ță de utilizator pe care datele
sunt compuse.
Alte motoare de vedere:
Biblioteca MVCContrib con ține 8 motoare vedere alternative. Brail, NDjango, NHaml,
NVelocity, SharpTiles, Spark, StringTemplate și XSLT.
Motorul StringTemplate View utilizeaz ă un port .NET cu popularul motor Java
templating, StringTemplate.
Spark este un motor de vedere pentru ASP.NET MVC.
NDjango este un port de populare Django cu motorul template la .NET. Este scris în F #
și vine cu extensia Visual Studio inclusiv suport complet IntelliSense.
302.3 Compararea versiunilor de .NET Framework
2.3.1 .NET Framework 1.0
Prima versiune a .NET Framework a fost lansat ă la 13 februarie 2002, pentru Windows
98, ME, NT 4.0, 2000, și XP. Suportul Mainstream pentru aceast ă versiune s-a incheiat la 10
iulie 2007, și suportul extins încheiat la 14 iulie 2009, cu excep ția Windows XP Media Center și
Tablet PC edi ții.
2.3.2 .NET Framework 1.1
Versiunea 1.1 este primul mare înbunata țire .NET Framework. Aceasta este disponibil ă
pe cont propriu ca un pachet redistribuibil sau într-un kit de dezvoltare software, fiind publicat la
data de 3 aprilie 2003. De asemenea, este parte din a doua versiune a Visual Studio .NET 2003.
Aceasta este prima versiune a .NET Framework și este inclus ăca parte a sistemului de operare
Windows, de Minestream cu Windows Server 2003. Suportul Mainstream pentru .NET
Framework 1.1 s-a incheiat la 14 octombrie 2008, și suportul extins s-a incheiat la 8 octombrie
2013. Începând cu versiunea 1.1 este o component ă a Windows Server 2003 și va primi sprijin
extins împreun ă cu sistemul de operare pân ă la 14 iulie 2015.
Instalarea .NET Framework 1.1 asigur ă, de asemenea, sprijin de sistem pentru versiunea
1.0, cu excep ția cazurilor rare în care o cerere nu va rula pentru c ă verifică numărul de versiune a
unei biblioteci.
Modificările în versiunea 1.1 include:
Sprijin Built-in pentru controalele ASP.NET mobile, care a fost disponibile anterior ca un
add-on.
Windows Forms permite ansambluri pentru a executa într-o manier ă de incredere de pe
Internet.
Permite codul de acces de securitate în aplica ții ASP.NET.
Sprijin Built-in pentru ODBC și baze de date, care a fost disponibil anterior ca un add-on.
NET Compact Framework, o versiune de .NET Framework pentru dispozitive mici și
suport Internet Protocol versiunea 6 (IPv6) .
312.3.3 .NET Framework 2.0
Versiunea 2.0 a fost lansat ă la data de 22 ianuarie 2006. Aceasta a fost, de asemenea,
lansată împreună cu Visual Studio 2005, Microsoft SQL Server 2005, și BizTalk 2006. Un chit
de dezvoltare software pentru aceast ă versiune a fost lansat pe 29 noiembrie 2006. A fost ultima
versiune care a sprijinit Windows 98 și Windows Me.
Modificarile în versiunea 2.0:
Suport complet de calcul pe 64 de bi ți, atât pentru x64 și platforme hardware IA-64.
Numeroase schimb ări API.
Integrarea Microsoft SQL Server: În loc de a folosi T-SQL, se pot construi proceduri
stocate care sunt declan șate în oricare dintre limbile compatibile cu .NET.
Un nou API de hosting pentru aplicatii native care doresc s ă găzduiască o instanță a
runtime .NET: Noul API ofer ă un control granula ție fină asupra comportamentului runtime cu
privire la multithreading, alocare de memorie și de asamblare de înc ărcare.
Acesta a fost ini țial dezvoltat pentru a g ăzdui în mod eficient runtime în Microsoft SQL
Server, care pune în aplicare programele proprii și memoria managerul sau.
Multe controale suplimentare și îmbunătățite web ASP.NET.
Noi controale de date. Cu date declarative obligatorii.
Noile caracteristici de personalizare pentru ASP.NET, cum ar fi suport pentru teme, piei,
pagini de master și webparts.
.NET Micro Framework o versiune .NET Framework legat de ini țiativa Smart Personal
Objects Technology.
Furnizor de membru
Clase parțiale
Tipuri nulabile
Metode anonime
Iterații
Tabele de date
Common Language Runtime (CLR) 2.0
Suport lingvistic pentru construc ții generice direct în .NET CLR
322.3.4 .NET Framework 3.0
.NET Framework 3.0, denumit anterior WinFX, a fost lansat pe 21 noiembrie 2006.
Acesta include un nou set de API-uri de cod de gestionare care fac partea integrant ă din
Windows Vista și Windows Server 2008. De asemenea este disponibil pentru Windows XP SP2
și Windows Server 2003 ca și descărcare. Nu exist ă modificări arhitecturale majore incluse în
această versiune, .NET Framework 3.0 folosind acela și CLR ca.NET Framework 2.0. Versiunea
3.0 a .NET Framework este livrat cu Windows Vista.
.NET Framework 3.0 este format din patru componente majore noi:
Windows Presentation Foundation (WPF), fost ă Avalon: un nou subsistem, interfa ță de
utilizator și API bazat pe XAML ca limbaj de marcare, care utilizeaz ă 3D grafica pe calculator
hardware și tehnologii Direct3D.
Windows Communication Foundation (WCF) fost ă Indigo: un sistem de mesagerie
service-oriented, care permite programelor s ă interacționeze la nivel local sau la distan ță similară
cu servicii web.
Ferestre Workflow Foundation (WWF): permite automatizarea construc ția task-urilor,
construcție și tranzacții integrate folosind fluxuri de lucru.
Ferestre CardSpace, cu numele de cod anterior InfoCard: o componenta software care
stochează în siguran ță identitatea digital ă unei persoane și oferă o interfață unificată pentru
alegerea identit ății pentru o anumit ă tranzacție, cum ar fi conectarea la un site.
2.3.5 .NET Framework 3.5
Versiunea 3.5 a .NET Framework a fost lansat pe 19 noiembrie 2007. Ca și în cazul .NET
Framework 3.0, versiunea 3.5 foloseste Common Language Runtime (CLR) 2.0, care este,
aceeași versiune ca versiunea .NET Framework 2.0. În plus, .NET Framework 3.5 instaleaz ă, de
asemenea, .NET Framework 2.0 SP1 și 3.0 SP1 ( și mai instaleaz ă 3,5 SP1 în loc de 2,0 SP2 și
3,0 SP2), care adaug ă unele metode și proprietăți pentru clasele BCL în versiunea 2.0, care sunt
necesare pentru versiunea 3.5, caracteristici cum ar fi limbajul de interogare integrat (LINQ). Cu
toate acestea, aceste modific ări nu afecteaz ă cererile scrise pentru versiunea 2.0. Ca și în
versiunile anterioare, un nou .NET Compact Framework 3.5 a fost lansat în tandem cu aceast ă
actualizare pentru a oferi suport pentru caracteristici suplimentare pe Windows Mobile și
dispozitive Windows Embedded CE. Codul surs ă pentru Framework Class Libraty din aceast ă
versiune a fost par țial eliberat (numai pentru referin ță la depanare) sub licen ța Microsoft
Reference Source.
.NET Framework 3.5 Service Pack 1 a fost lansat la data de 11 august 2008. Aceast ă
versiune adaug ă noi funcționalități și oferă îmbunătățiri de performan ță în anumite condi ții, în
special în WPF unde sunt de a șteptate 20-45% îmbun ătățiri. Au fost ad ăugate dou ă componente
de servicii de date noi, ADO.NET Entity Framework și ADO.NET Data Services. Au fost
adăugate dou ă componente de servicii de date noi, Entity Framework ADO.NET ADO.NET și
serviciile de date. Dou ă ansambluri noi de dezvoltare web System.Web.Abstraction și
33System.Web.Routing, au fost ad ăugate. Acestea sunt utilizate în Cadrul ASP.NET MVC și,
potrivit surselor, vor fi utilizate în viitor in aplica ții ASP.NET Forms. Service Pack 1 este inclus
cu SQL Server 2008 si Visual Studio 2008 Service Pack 1. care prezent ă, de asemenea, un nou
set de controale numite "Visual Basic Power Packs" care a adus înapoi control Visual Basic, cum
ar fi "Line" și "Shape". Versiunea 3.5 SP1 a .NET Framework este livrat ă cu Windows 7. De
asemenea este livrat cu Windows Server 2008 R2 ca o component ă opțională (dezactivat ă în mod
implicit).
Pentru .NET Framework 3.5 SP1 este, de asemenea, o noua varianta a .NET Framework,
numit ".NET Framework Client Profile", care la 28 de MB este semnificativ mai mic ă decât
cadrul deplin și instaleaz ă doar componente care sunt cele mai relevante pentru aplicatii desktop.
Cu toate acestea, Client Profile se ridic ă la această dimensiune numai dac ă folosiți programul de
instalare on-line pe Windows XP SP2, atunci când nu sunt instalate alte cadre NET sau folosind
Windows Update. Când utiliza ți instalare off-line sau orice alt sistem de operare, dimensiunea de
descărcare este înc ă 250 MB.
2.3.6 .NET Framework 4.0
Cheile concentrate pentru aceast ă versiune sunt:
Extensii paralele pentru a îmbun ătăți sprijinul pentru calcul paralel, care vizeaz ă multi-
core sau sisteme distribuite. În acest scop, tehnologii precum PLINQ (Parallel LINQ), au o
implementare paralel ă a motorului LINQ și Task Parallel Library, care expune construc ții
paralele prin apeluri de metode ,sunt incluse.
Noile caracteristici Visual Basic .NET și limbajul C #, cum ar fi: continu ări implicite de
linie, expediere dinamic ă, parametrii numi ți și parametrii op ționali.
Suport pentru Code Contacts.
Include noi tipuri aritmetice care lucreaz ă cu numere de precizie aleatoare
(System.Numerics.BigInteger) si mere complexe (System.Numerics.Complex).
Introduce Common Language Runtime (CLR) 4.0.
2.3.7.NET Framework 4.5
NET Framework 4.5 a fost lansat la data de 15 august 2012. Un set de caracteristici noi
sau îmbun ătățiri au fost ad ăugate în aceast ă versiune. .NET Framework 4.5 este acceptat numai
pe Windows Vista sau pe versiuni mai noi. Framework 4.5 folose ște un limbaj comun de
Runtime 4.0, cu unele caracteristici suplimentare de rulare.
.NET pentru stilul aplica țiilor Metro
Stilul aplica țiilor Metro sunt proiectate pentru factori de form ă specifică și pârghie de
putere a sistemului de operare Windows. Un subset al .NET Framework este disponibil pentru
34construirea unui stil aplica ție Metro pentru Windows 8 folosind C # sau Visual Basic. Acest
subset este numit API .NET pentru aplica ții.
Versiunea de .NET Framework, execu ție și biblioteci, utilizate pentru aplica ții în stil
Metro este o parte din noul Windows Runtime, care este noul model platform ă și aplicarea
modelului de aplica ții în stil Metro. Este un ecosistem care ad ăpostește mai multe platforme și
limbaje, inclusiv .NET Framework, C ++ și HTML5 / JavaScript.
Framework Core
Caracteristici de baz ă
Abilitatea de a limita cât timp motorul expresie regulat ă va încerca s ă rezolve o expresie
regulată înainte de a o scoate afar ă
Capacitatea de a defini cultura pentru un domeniu de aplicare.
Suport consol ă pentru codificarea Unicode (UTF-16).
Suport pentru versiunile șirurilor de comand ă a datelor și compararea datelor.
Performață mai bună atunci când resursele sunt preluate.
Îmbunătățiri de compresie zip, pentru a reduce dimensiunea unui fi șier comprimat.
Abilitatea de a personaliza un context de reflec ție pentru a trece peste comportamentul
implicit reflec ție prin clasa CustomReflectionContext.
Operațiunile asincrone
În .NET Framework 4.5, noi caracteristici asincrone au fost ad ăugate la C # și limbajul
Visual Basic. La aceste caracteristici se adaug ă un model bazat pe sarcini pentru efectuarea
operațiunilor asincrone.
ASP.NET
Suport pentru noile tipuri de form ă HTML5.
Suport pentru modele de bid-uri în Web Forms
Acestea v ă permit să se lege de control de date direct de metode de acces a datelor, și
convertește automat datele introduse de utilizator la și de la tipurile de date .NET Framework.
Suport pentru JavaScript discret în scripturi de validare client-side.
A fost îmbunata țit manipularea script client prin grupare și minimizare pentru
îmbunatațirea performan ței paginii
Rutine integrate de codare din biblioteca AntiXSS (anterior o bibliotec ă externă) pentru a
proteja de atacuri cross-site scripting.
Suport pentru protocol WebSocket.
Suport pentru citirea și scrierea cereri HTTP și răspunsuri asincron.
Suport pentru module asincrone și manipulare.
Suport pentru con ținutul de re țea de distribu ție (CDN) de rezerv ă în controlul
ScriptManager.
35Networking
Oferă o nouă interfață de programare pentru aplica ții HTTP: Se adaug ă namespace
System.Net.Http și System.Net.Http.Headers spa țiile de nume.
Internaționalizare îmbun ătățită și suport IPv6.
RFC-Suportori URI conforme .
Suport pentru nume de domeniu interna ționalizate (IDN) descompunere.
Suport pentru Email Address Internationalization (EAI).
2.3.8 .NET Framework 4.5.1
Lansarea .NET Framework 4.5.1 a fost anun țată la 17 octombrie 2013, împreun ă cu
Visual Studio 2013. Aceast ă versiune necesit ă Windows Vista SP2 și versiuni mai noi și este
inclus în Windows 8.1 și Windows Server 2012 R2.
2.3.9 .NET Framework 4.5.2
Lansarea .NET Framework 4.5.2 a fost anun țată pe data de 5 mai 2014. Pentru aplica ții
Windows Forms, s-au f ăcut îmbun ătățiri, pentru mari scenarii DPI. Pentru ASP.NET, metode de
fiabilitate HTTP, de inspec ție antet și de modificare sunt disponibile ca un nou mod de a
programa în fundalul de sarcini pentru lucr ări asincrone.
2.4 Contrast între Entity Framework si NHibernate
NHibernate și Entity Framework sunt dou ă dintre cele mai populare cadrelor ORM-uri
din lumea .NET. Cu toate c ă au aceeași funcționalitate, acestea au destul de multe aspecte
diferite.
NHibernate este un proiect open-source care a fost portat, în primul rând, din cadrul
Hibernare al venerabilului Java, unul dintre primele framework-uri ORM, nefiind legat de el, de
exemplu, tr ăsăturile specifice .NET, au evoluat în moduri diferite de la cele ale omologul s ău
Java. Versiunea curent ă este 3.3, cu 3.4 la orizont. Acesta vizeaz ă prezent .NET 3.5, dar poate fi
folosit la fel de bine în .NET 4, deoarece nu depinde de nici o caracteristic ă a .NET 3.5.
Entity Framework 1 a venit cu NET 3.5 și scum este la a doua versiune major ă. Metoda
de proiectare Code First este în continuare baza ORM-urilor și va continua s ă existe în
următoarele versiuni. Verisiunea curent ă este 5 cu .NET Framework 4.5.
În NHibernate, exist ă o separare între unitatea de lucru, de configurare și modele. SE
începe prin crearea unui obiect de configurare, în cazul în care se specific ă toate setările globale
NHibernate, cum ar fi baza de date cu dialectul folosit, dimensiunile lot, map ările, etc, atunci va
36construi un ISessionFactory de la ea. ISessionFactory de ține modelului și metadatele care sunt
legate de o anumit ă bază de date și la setările care au venit de la obiectul de configurare, și nu va
fi de obicei o singur ă instanță din fiecare, într-un proces. În cele din urm ă, veți creea instan țe ale
ISession din ISessionFactory, care este reprezentarea NHibernate a unita ții de lucru și identitatea
Harții. Acesta este un obiect de dimensiune mic ă, el deschide și deschide o conexiune de date în
funcție de necesit ăți și ține eviden ța entităților asociate cu acesta. Când creezi un obiect ISession
nu este foarte greu de modificat, deoarece toate complexit ățile modelului sunt stocate în
ISessionFactory și Configuratorul de obiecte. Pentru Entity Framework, ObjectContext /
DbContext de țin configurarile, modelul și acționează ca unitate de lucru, care de ține trimiteri la
toate entit ățile cunoscute.
Atât NHibernate și Entity Framework sus țin utilizarea POCOs pentru a reprezenta
entități, fiind necesare cursuri de baz ă.
În ceea ce prive ște cartografierea la și de la baza de date, NHibernate suport ă trei tipuri
de mapare:
-XML-based, care au avantajul de a nu lega claselor entitate pentru un anumit ORM;
fișierele XML pot fi utilizate ca fi șiere pe sistemul de fi șiere sau ca resurse încorporate într-o
adunare;
-Atribut-based, pentru a p ăstra atât entit ățile cât și detaliile bazei de date de pe acela și loc
în detrimentul claselor entitate poluate cu atribute NHibernate specifice;
-Mapare bazat ă pe cod care permite crearea dinamic ă a modelului, astfel încât dac ă
modelul se schimb ă. se schimb ă si baza.
Entity Framework pot folosi:
-Atribute-based (de și atributele nu pot exprima toate posibilit ățile disponibile)
-Mapare bazat ă pe cod
Cu NHibernate pute ți utiliza cea mai mare parte a bazelor de date pe care le dori ți,
inclusiv:
SQL Server;
SQL Server Compact;
SQL Server Azure;
Oracle;
DB2;
PostgreSQL;
MySQL;
Sybase Adaptive Server / SQL Anywhere; Firebird;
SQLLite;
Informix;
Orice baz ă de date prin OLE DB;
Orice baz ă de date prin ODBC;
37NHibernate expune mai multe API-uri de interogare:
-LINQ este probabil cel mai utilizat în zilele noastre, și într-adev ăr nu are nevoie s ă fie
introduse;
-Hibernate Query Language (HQL) este un, obiect orientat care seam ănă cu SQL și care
exista de la crearea NHibernate și încă oferă posibilități de interogare mai avansate bine adaptate
pentru interog ări dinamice, chiar dac ă se utilizeaz ă șir de concatenare;
-SQL, pot fi utilizate, de asemenea inclusiv proceduri stocate;
În ceea ce prive ște Entity Framework:
-Entitățile LINQ sunt pe deplin sus ținute, iar punerea sa în aplicare este considerat ă
completă;
-Entity-SQL este omologul lui HQL, deasemenea orientat pe obiecte, independent de
baza de date;
Proprietăți
Entity Framework și NHibernate suport ă următoarele tipuri de propriet ăți:
-tipuri valoare
-colecții
-enumerații
-scalari
-proprietăți compuse
-tipuri entitate
Lazy Loading
Lazy Loading înseamn ă încărcarea tipurilor entitate la nevoie, adic ă în momentul
apelării. Aceasta aduce un beneficiu din punct de vedere al memoriei. Este suportat atât de
NHibernate cât și de Entity Framework.
Lazy Loading in NHibernate suport ă:
-entități asociate (unul la unul, mai mul ți la unul)
-colecții (unul la mai mul ți, mai mul ți la mai mul ți)
-proprietăți scalare (vectori de octe ți)
382.5 Framework-ul Bootstrap- HTML, CSS, JAVAScript
Ce este HTML?
HTML este un limbaj de marcare pentru a descrie documente web (pagini web).
-HTML vine de la Hyper Text Markup Language
-Un limbaj de marcare este un set de tag-uri marcate
-Documentele HTML sunt descrise de tag-uri HTML
-Fiecare tag HTML descrie con ținutul unui alt document
Un mic document HTML
<!DOCTYPE html>
<html>
<head>
<title>Page Title </title>
</head>
<body>
<h1>My First Heading </h1>
<p>My first paragraph. </p>
</body>
</html>
Explicarea exemplului
-Declarația DOCTYPE define ște tipul de document pentru a fi HTML
-Textul dintre <html> și </ html> descrie un document HTML
-Textul dintre <head> și </ head> ofer ă informații despre documentul
-Textul dintre <title> și </ title> prevede un titlu pentru document
-Textul dintre <body> și </ body> descrie con ținutul paginii vizibil
-Textul dintre <h1> și </ h1> descrie o pozi ție
-Textul dintre <p> și </ p> descrie un paragraf
Folosind aceast ă descriere, un browser web poate afi șa un document cu un titlu și un
paragraf.
Tag-uri HTML
Tag-uri HTML sunt cuvinte cheie (nume tag), înconjurate de paranteze unghiulare:
<tagname>content</tagname >
39-Tag-uri HTML sunt în mod normal în perechi ca <p> și </ p>
-Primul tag într-o pereche este eticheta de start, al doilea tag este tag-ul final
-Tag-ul final este scris ca tag-ul de start, dar cu un slash înainte de numele tag
Browse-re Web
Scopul unui browser web (Chrome, Internet Explorer, Firefox, Safari) este de a citi
documente HTML și a le afișa.
Browserul nu afi șează etichetele HTML, dar le folose ște pentru a determina modul de
afișare a documentului:
Structura unei pagini HTML
<html>
<head>
<title>Page title</title>
40</head>
<body>
<h1>This is a heading</h1>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
</body>
</html>
Numai zona <body> este afi șată de browser.
Declarația <! DOCTYPE>
Declarația <! DOCTYPE> ajut ă browser-ul s ă afișeze o pagin ă web în mod corect.
Există diferite tipuri de documente pe web.
Pentru a afi șa un document corect, browserul trebuie s ă știe atât tipul și versiunea.
Declarația doctype nu este sensibil la majuscule. Toate cazurile sunt acceptabile: 3
<!DOCTYPE html>
<!DOCTYPE HTML>
<!doctype html>
<!Doctype Html>
Declarații comune
HTML 5
<!DOCTYPE html>
41HTML 4.01
<!DOCTYPE HTML PUBLIC>
XHTML 1.0
<!DOCTYPE html PUBLIC>
Bootstrap este o colec ție de instrumente pentru crearea de site-uri și aplicații web,
disponibil gratuit (open-source). Acesta con ține template-uri bazate pe HTML și CSS pentru
diferite forme de aplicare: tipografie, forme, butoane, navigare și alte componente de interfa ță
grafică, precum și extensii op ționale JavaScript. Framework-ul Bootstrap urm ărește să faciliteze
și ușureze dezvoltarea web.
Bootstrap este un front-end, care este mai exact, o interfa ță pentru utilizator. De asemenea este
un framework web-application, care este în sine, un framework software ce este proiectat pentru
a sprijini dezvoltarea de site-uri dinamice și aplicații web.
Origine
Bootstrap, numit ini țial Twitter Blueprint , a fost dezvoltat de Mark Otto și Jacob
Thornton la Twitter, ca un framework pentru a încuraja coeren ța și stabilitatea asupra
instrumentelor interne. Înainte de Bootstrap, diverse biblioteci au fost utilizate pentru dezvoltarea
interfeței, acțiune ce a condus la neconcordan țe și la o povar ă mare de între ținere. Dup ă câteva
luni de devoltare de c ătre un grup mic, mul ți dezvoltatori de la Twitter au început s ă contribuie la
proiect ca parte a ‘Hack Week’, o s ăptamână în stil Hackathon pentru echipa de dezvoltare a
Twitter. Acesta a fost redenumit din ‘Twitter Blueprint’ în ‘ Bootstrap ’ și lansat pe pia ță ca un
proiect open-source la data de 19.08.2011. A continuat s ă fie continuu îmbun ătațit de către Mark
Otto, Jacob Thornton și un mic grup de dezvoltatori de baz ă, precum și de o larg ă comunitate de
susținători.
Pe 31.01.2012, Bootstrap 2 a fost anun țat. Aceast ă lansare a ad ăugat aspectul de 12-coloane și
componente de ‘responsive-design’, precum și modificări la multe din componentele deja
existente. Lansarea a Bootstrap 3 a fost anun țată pe 19.08.2013, trecând la o prim ă abordare în
design-ul pentru telefoanele mobile.
Caracteristici
Bootstrap este compatibil cu cele mai recente versiuni ale browser-elor Google Chrome,
Firefox, Internet Explorer, Opera și Safari, de și unele dintre aceste browsere nu sunt suportate de
toate platformele. Începând cu versiunea 2.0 suport ă de asemenea design-ul web responsive
(receptiv). Aceasta înseamn ă că aspectul paginilor web se ajusteaz ă dinamic, luând în
considerare caracteristicile dispozitivului folosit (desktop, tablet ă, telefon mobil).
Începând cu versiunea 3.0, Bootstrap a adoptat o filosofie de design "mobile first",
asumând design-ul responsive ca implicit. Bootstrap este open source și disponibil pe GitHub.
Dezvoltatorii sunt încuraja ți să participe la proiect și să-și aducă propriile contribu ții la
platformă.
42Structură și funcționalitate
Bootstrap este modular și constă în principal dintr-o serie de foi de stil LESS ce
implementeaz ă diversele componente ale setului de instrumente. O foaie de stil numit ă
bootstrap.less include componente tip foi de stil. Dezvoltatorii pot adapta fi șierele Bootstrap în
sine, selectând componentele pe care doresc s ă le foloseasc ă în proiectul lor. Ajust ări sunt
posibile într-o masur ă limitată prin intermediul unei foi de stil (stylesheet) centrale, de
configura ție. Schimb ări majore sunt posibile prin intermediul declara țiilor LESS (stylesheet
language).
Utilizarea LESS permite utilizarea de variabile, func ții și operatori, selectori îmbrica ți,
precum și așa numitelor mixins .
Componenta CSS a Bootstrap
Bootstrap ofer ă un set de stylesheets (foi de stil) ce furnizeaz ă definiții pentru stilul de
bază a tuturor componentelor cheie HTML.
Componente reutilizabile
Pe lângă elementele HTML obi șnuite, Bootstrap con ține și alte elemente de interfa ță
utilizate în mod obi șnuit. Acestea includ butoane cu func ții avansate (de exemplu, gruparea de
butoane sau butoane cu op țiunea derulant ă, liste de navigare, naviga ție, paginare, etc.), etichete,
capacități avansate de tipografie, miniaturi, mesaje de avertizare și o bară de progres.
Componentele sunt implementate ca și clase CSS, care trebuiesc aplicate anumitor elemente
HTML dintr-o pagin ă.
Componentele JavaScript
Bootstrap vine cu câteva componente JavaScript sub form ă de plugin-uri
jQuery. Acestea ofer ă elemente suplimentare de interfa ță cu utilizatorul cum ar fi casetele
de dialog, mesajele tip tooltip etc. De asemenea extind func ționalitatea unor elemente de
interfață, incluzând de exemplu o func ție de auto-complete pentru câmpurile de
introducere. În versiunea 2.0, urm ătoarele plugin-uri JavaScript sunt suportate: Modal,
Dropdown, Scrollspy, Tab, Tooltip, Popoever, Alert, Button, Collapse, Carousel și
Typeahead.
3.Descriea aplica
Aplicația, un sistem de licita ții on
utilizat pentru oricine dore ște sa vând ă sau să cumpere diferite obiecte, second
noi, pentru cine caut ă sau oferă servicii pentru diferite domenii,
locuri de munc ă. Crearea unui cont, gestionarea acestuia sau administrarea unei licita
doar câteva clicuri distan ță.
Pe pagina principal ă utilizatorul poate urm ării ultimele 10 post ări si poate c ăuta foarte
ușor un anunț cu ajutorul barii de cautare.
Prin apăsarea butonului licita
433.Descriea aplica ției
ția, un sistem de licita ții on-line, confer ă o interfață simplă, intuitivă și ușor de
ște sa vând ă sau să cumpere diferite obiecte, second -hand sau chiar
noi, pentru cine caut ă sau oferă servicii pentru diferite domenii, cursuri de formare sau chiar
locuri de munc ă. Crearea unui cont, gestionarea acestuia sau administrarea unei licita
Pe pagina principal ă utilizatorul poate urm ării ultimele 10 post ări si poate c ăuta foarte
ț cu ajutorul barii de cautare.
Prin apăsarea butonului licita ții se revine la pagina principal ă cu ultimele 10 post ări.
ță simplă, intuitivă și ușor de
hand sau chiar
cursuri de formare sau chiar
locuri de munc ă. Crearea unui cont, gestionarea acestuia sau administrarea unei licita ții sunt la
Pe pagina principal ă utilizatorul poate urm ării ultimele 10 post ări si poate c ăuta foarte
ții se revine la pagina principal ă cu ultimele 10 post ări.
Pentru a posta un anun ț sau o licita ție utilizatorul trebuie s ă se inregistreze foarte simplu.
Utilizatorul trebuie s ă apese clic în dreapta sus pe butonul de
CREEAZĂ CONT.
44ț sau o licita ție utilizatorul trebuie s ă se inregistreze foarte simplu.
Utilizatorul trebuie s ă apese clic în dreapta sus pe butonul de LOG IN și trebuie s ă selecteze
ț sau o licita ție utilizatorul trebuie s ă se inregistreze foarte simplu.
și trebuie s ă selecteze
În cazul în care utilizatorul completeaz ă cu o adres ă de mail sau un num ăr de telefon care
nu are forma corect ă, va da eroare în drep
apărea localit ățile care apar țin județului selectat.
Butonul CATEGORII PRODUSE
promovate pe site sau licita țiile active.
În cadrul categoriilor majore în num ăr de 11 se afl ă 86 de categorii minore care satisface
toată plaja de produse si servicii.
45În cazul în care utilizatorul completeaz ă cu o adres ă de mail sau un num ăr de telefon care
nu are forma corect ă, va da eroare în drep tul câmpului respectiv. Dup ă selectarea jude
țile care apar țin județului selectat.
CATEGORII PRODUSE afișează categoriile din care pot face parte anun țurile
țiile active.
În cadrul categoriilor majore în num ăr de 11 se afl ă 86 de categorii minore care satisface
toată plaja de produse si servicii.
În cazul în care utilizatorul completeaz ă cu o adres ă de mail sau un num ăr de telefon care
tul câmpului respectiv. Dup ă selectarea jude țului, vor
șează categoriile din care pot face parte anun țurile
În cadrul categoriilor majore în num ăr de 11 se afl ă 86 de categorii minore care satisface
Log in -ul utilizatorului se face ap ăsând butonul din dreapta sus
completa cu adresa de e -mail și parol
46ul utilizatorului se face ap ăsând butonul din dreapta sus LOGIN unde se va
și parol a după care se apas ă butonul de login.
unde se va
După accesarea contului, utilizatorul poate gestiona anun
alte produse.
47După accesarea contului, utilizatorul poate gestiona anun țurile proprii, cump ăra sau licita
țurile proprii, cump ăra sau licita
Adăugarea anun țului este foarte u șor de realizat, ad ăugând
modul în care se dore ște să se vândă produsul, licita ție sau pre ț negociabil. Scurta descriere a
produsului vine ca o promovare a acestuia, selectând categoria din care face parte produsul,
urmat de introducerea pre țului nego
ore. Desigur, toate acestea sunt completate de ad ăugarea fotografiilor cu produsul din anun
48țului este foarte u șor de realizat, ad ăugând un titlu anun țului, selectând
ște să se vândă produsul, licita ție sau pre ț negociabil. Scurta descriere a
produsului vine ca o promovare a acestuia, selectând categoria din care face parte produsul,
țului nego ciabil sau pre țul începerii licita ției care dureaz ă doar 24 de
ore. Desigur, toate acestea sunt completate de ad ăugarea fotografiilor cu produsul din anun
țului, selectând
ște să se vândă produsul, licita ție sau pre ț negociabil. Scurta descriere a
produsului vine ca o promovare a acestuia, selectând categoria din care face parte produsul,
țul începerii licita ției care dureaz ă doar 24 de
ore. Desigur, toate acestea sunt completate de ad ăugarea fotografiilor cu produsul din anun ț.
Concluzii
Sub îndrumarea coordonatorului meu
reușit să realizez sistemul de licita ții on
începutul lucrarii. Din punctul meu de vedere sistemul este foarte u
cu posibilitatea de promovare a tuturor domen
cumpărare.
ANEXE
Baza de date
49coordonatorului meu științific Lector univ. dr. P ăun Viorel am
șit să realizez sistemul de licita ții on-line și să folosesc toate tehnologiile propuse la
începutul lucrarii. Din punctul meu de vedere sistemul este foarte u șor de utilizat, intuitiv,
posibilitatea de promovare a tuturor domen iilor de activitate ce presupun
științific Lector univ. dr. P ăun Viorel am
și să folosesc toate tehnologiile propuse la
șor de utilizat, intuitiv,
iilor de activitate ce presupun vânzare șă
Anunț
50
BID
Categorie major ă
51
Categorie minor ă
52
Județ
53
Localitate
54
Poze
55
Utilizator
56
Legăturile din baza de date
57Legăturile din baza de date
58Codul surs ă
RouteConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace Site_Licitatii_ASP.NET_MVC_5
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//Home
routes.MapRoute("Home", "", new { controller = "Home", action = "ShowHome"});
//Login
routes.MapRoute("Login", "Login", new {controller = "Utilizator", action="Login" });
//Logout
routes.MapRoute("Logout", "Logout", new {controller="Utilizator", action="Logout" });
//Inregistrare utilizator
routes.MapRoute("Inregistrare", "Inregistrare", new { controller = "Utilizator", action = "Inregistrare" });
//Lista localitati
routes.MapRoute("Localitati", "Localitati/{judetid}", new {controller = "Utilizator", action="Localitati",
judetid=-1 });
//Adaugare anunt
routes.MapRoute("AdaugareAnunt", "AdaugareAnunt", new { controller = "Anunturi", action = "Adaugare"
});
//Refresh licitatie
routes.MapRoute("RefreshLicitatie", "Anunt/{id}/Refresh", new { controller = "Anunturi", action =
"Refresh", id = -1 });
59 //Vizualizare anunt
routes.MapRoute("VizualizareAnunt", "Anunt/{id}", new { controller = "Anunturi", action = "Vizualizare"
});
//Lista anunturi din categorie
routes.MapRoute("AnunturiCategorie", "Categorii/{catid}/{pag}", new { controller = "Anunturi", action =
"AnunturiCategorie", catid = -1, pag = 1 });
//Cautare anunturi
routes.MapRoute("Cautare", "Cautare/{pag}", new { controller = "Anunturi", action = "Cautare", pag = 1 });
//Cumparare anunt
routes.MapRoute("Cumparare", "Cumpara/{id}", new { controller = "Anunturi", action = "Cumparare", id =
-1 });
//Bid
routes.MapRoute("Bid", "Bid/{id}", new { controller = "Anunturi", action = "Bid", id = -1 });
//Admin anunturi
routes.MapRoute("AdminAnunturi", "AnunturileMele/{pag}", new { controller = "Anunturi", action =
"Admin", pag = 1 });
//Stergere anunt
routes.MapRoute("StergereAnunt", "Anunturi/{id}/Stergere", new { id = -1, controller = "Anunturi", action
= "Stergere" });
}
}
}
Controllers
AnunturiController.cs
using Site_Licitatii_ASP.NET_MVC_5.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PagedList;
using Newtonsoft.Json;
using System.Web.Helpers;
namespace Site_Licitatii_ASP.NET_MVC_5.Controllers
{
60 public class AnunturiController : Controller
{
private Entities db = new Entities();
[HttpGet]
public ActionResult Adaugare()
{
return View("~/Views/Front/AdaugareAnunt.cshtml", new AdaugareAnuntViewModel());
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Adaugare(AdaugareAnuntViewModel model)
{
DateTime azi = DateTime.Now;
if (!ModelState.IsValid)
{
model.erori.Add("Eroare la salvarea anun țului!");
return View("~/Views/Front/AdaugareAnunt.cshtml", model);
}
model.anunt.categorieminora_id = model.CategorieMinoraSelectata;
model.anunt.utilizator_id = Helper.userLogat().id;
if (model.anunt.e_licitatie)
{
model.anunt.data_finalizare = azi.AddDays(1);
}
db.anunt.Add(model.anunt);
db.SaveChanges();
if (Request.Files.Count > 0)
{
string path = Server.MapPath("~/Date/Poze/" + model.anunt.id + "/");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
int i = 0;
foreach (string file in Request.Files)
{
HttpPostedFileBase pozaa = Request.Files[i++];
61 if (pozaa == null || pozaa.ContentLength == 0 || pozaa.FileName.Length == 0)
{
continue;
}
pozaa.SaveAs(path + pozaa.FileName);
poza p = new poza();
p.cale_fisier = "/Date/Poze/" + model.anunt.id + "/" + pozaa.FileName;
p.anunt_id = model.anunt.id;
model.anunt.poze.Add(p);
db.SaveChanges();
}
}
FrontViewModel rmodel = new FrontViewModel();
rmodel.mesaje.Add("Anun țul dvs. a fost publicat cu succes!");
return View("~/Views/Front/Home.cshtml", rmodel);
}
[HttpGet]
public ActionResult Vizualizare(int id)
{
AnuntViewModel model = new AnuntViewModel();
anunt a = db.anunt.Find(id);
if (a == null)
{
model.erori.Add("Anun țul nu exist ă!");
return View("~/Views/Shared/Eroare.cshtml", model);
}
if (a.finalizat)
{
model.avertismente.Add("Acest anun ț/această licitație a fost finalizat( ă)!");
return View("~/Views/Shared/Eroare.cshtml", model);
}
model.anunt = a;
return View("~/Views/Front/Anunt.cshtml", model);
}
[HttpGet]
[Authorize]
public ActionResult Cumparare(int id)
62 {
FrontViewModel model = new FrontViewModel();
anunt a = db.anunt.Find(id);
if (a == null)
{
model.erori.Add("Anun țul nu exist ă!");
return View("~/Views/Shared/Eroare.cshtml", model);
}
if (a.e_licitatie)
{
model.erori.Add("Aceasta este o licita ție!");
return View("~/Views/Shared/Eroare.cshtml", model);
}
if (a.finalizat)
{
model.erori.Add("Acest anun ț a fost finalizat!");
return View("~/Views/Shared/Eroare.cshtml", model);
}
a.finalizat = true;
a.data_finalizare = DateTime.Now;
a.cumparator_id = Helper.userLogat().id;
db.SaveChanges();
return View("~/Views/Front/ConfirmareCumparare.cshtml",model);
}
[HttpPost]
[Authorize]
public ActionResult Bid(int id)
{
Dictionary<string, object> resp = new Dictionary<string, object>();
resp.Add("eroare", "");
resp.Add("succes", true);
anunt a = db.anunt.Find(id);
if (a == null)
{
resp["eroare"] = "Licita ția nu exista!";
resp["succes"] = false;
return Json(resp);
}
if (!a.e_licitatie)
{
63 resp["eroare"] = "Aceasta nu este o lici țatie!";
resp["succes"] = false;
return Json(resp);
}
if (a.finalizat)
{
resp["eroare"] = "Aceast ă licitație a fost finalizat ă deja!";
resp["succes"] = false;
return Json(resp);
}
DateTime acum = DateTime.Now;
if (a.data_finalizare.HasValue && a.data_finalizare.Value < acum)
{
resp["eroare"] = "Aceast ă licitație a fost finalizat ă deja!";
resp["succes"] = false;
return Json(resp);
}
try
{
double bid = double.Parse(Request["bid"]);
double ultimulpret;
try
{
ultimulpret = a.biduri.Max(b => b.suma);
}
catch (Exception)
{
ultimulpret = 0.0;
}
if (ultimulpret >= bid)
{
resp["eroare"] = "Bid-ul dvs. trebuie sa depaseasc ă ultimul bid ("+ultimulpret+" RON)!";
resp["succes"] = false;
return Json(resp);
}
bid bidnou = new bid();
bidnou.suma = bid;
64 bidnou.utilizator_id = Helper.userLogat().id;
bidnou.anunt_id = a.id;
a.biduri.Add(bidnou);
db.SaveChanges();
return Json(resp);
}
catch (Exception)
{
resp["eroare"] = "Date invalide!";
resp["succes"] = false;
return Json(resp);
}
}
[HttpGet]
public ActionResult Refresh(int id)
{
Dictionary<string, object> resp = new Dictionary<string, object>();
resp.Add("eroare", "");
resp.Add("succes", true);
resp.Add("pret", 0.0);
anunt a = db.anunt.Find(id);
if (a == null)
{
resp["eroare"] = "Licita ția nu exist ă!";
resp["succes"] = false;
return Json(resp);
}
if (!a.e_licitatie)
{
resp["eroare"] = "Aceasta nu este o licita ție!";
resp["succes"] = false;
return Json(resp);
}
if (a.finalizat)
{
resp["eroare"] = "Aceast ă licitatie a fost finalizat ă deja!";
resp["succes"] = false;
return Json(resp);
}
65 try
{
resp["pret"] = a.biduri.Max(b => b.suma);
}
catch (Exception)
{
resp["pret"] = a.pret;
}
return Json(resp,JsonRequestBehavior.AllowGet);
}
[HttpGet]
public ActionResult AnunturiCategorie(int catid, int pag)
{
ListaAnunturiViewModel model = new ListaAnunturiViewModel();
categorieminora categ = db.categorieminora.Find(catid);
if (categ == null)
{
model.erori.Add("Categoria nu exist ă!");
return View("~/Views/Shared/Eroare.cshtml", model);
}
model.categorie = categ;
model.titlu = "Anun țuri din categoria " + categ.denumire;
model.anunturi = db.anunt.Where(a => a.categorieminora_id == categ.id)
.Where(a => a.finalizat == false)
.OrderByDescending(a => a.data_adaugare)
.ToPagedList(pag, 10);
model.linkpaginare = page => Url.RouteUrl("AnunturiCategorie", new { pag = page, catid =
model.categorie.id });
return View("~/Views/Front/ListaAnunturi.cshtml", model);
}
[HttpGet]
public ActionResult Cautare(int pag)
{
if (Request["q"] == null)
{
66 return RedirectToRoute("Home");
}
string cautat = Request["q"].ToString();
ListaAnunturiViewModel model = new ListaAnunturiViewModel();
model.titlu = "C ăutare: " + cautat;
model.cautare = cautat;
model.anunturi = db.anunt.Where(a => a.finalizat == false)
.Where(a => (a.titlu.Contains(cautat) || a.descriere.Contains(cautat) || a.proprietar.nume.Contains(cautat)))
.OrderByDescending(a => a.data_adaugare)
.ToPagedList(pag, 10);
model.linkpaginare = page => Url.RouteUrl("Cautare", new { pag = page, q = cautat });
return View("~/Views/Front/ListaAnunturi.cshtml", model);
}
[Authorize]
[HttpGet]
public ActionResult Admin(int pag)
{
AdminAnunturiViewModel model = new AdminAnunturiViewModel();
model.anunturi = Helper.userLogat().anunturi
.OrderByDescending(a => a.data_adaugare)
.ToPagedList(pag, 10);
if (model.anunturi.Count == 0)
{
model.avertismente.Add("Nu a ți publicat niciun anun ț!");
return View("~/Views/Shared/Info.cshtml",model);
}
return View("~/Views/Front/AdminAnunturi.cshtml", model);
}
[Authorize]
[HttpGet]
public ActionResult Stergere(int id)
{
FrontViewModel model = new FrontViewModel();
67 anunt a = Helper.userLogat().anunturi.Where(an => an.id == id).FirstOrDefault();
if (a == null)
{
model.erori.Add("Anun țul nu exist ă!");
return View("~/Views/Shared/Eroare.cshtml", model);
}
anunt ant = db.anunt.Find(a.id);
db.anunt.Remove(ant);
db.SaveChanges();
return RedirectToRoute("AdminAnunturi");
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
HomeController.cs
using Site_Licitatii_ASP.NET_MVC_5.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PagedList;
using Site_Licitatii_ASP.NET_MVC_5;
namespace Site_Licitatii_ASP.Controllers
{
public class HomeController : Controller
{
private Entities db;
68 public HomeController()
{
db = new Entities();
}
[HttpGet]
public ActionResult ShowHome()
{
ListaAnunturiViewModel model = new ListaAnunturiViewModel();
model.titlu = "Acas ă – ultimele 10 post ări";
model.anunturi = db.anunt.Where(a => a.finalizat == false)
.OrderByDescending(a => a.data_adaugare)
.Take(10)
.ToPagedList(1, 10);
model.linkpaginare = page => Url.RouteUrl("Home");
return View("~/Views/Front/ListaAnunturi.cshtml", model);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
UtilizatorController.cs
using Newtonsoft.Json;
using Site_Licitatii_ASP.NET_MVC_5.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
namespace Site_Licitatii_ASP.NET_MVC_5.Controllers
{
public class UtilizatorController : Controller
{
//
69 // GET: /Inregistrare/
private Entities db = new Entities();
[HttpGet]
public ActionResult Inregistrare()
{
return View("~/Views/Front/Inregistrare.cshtml",new InregistrareViewModel());
}
[HttpGet]
public ActionResult Localitati(int judetid=-1)
{
judet j = db.judet.Find(judetid);
if (j == null)
{
return HttpNotFound();
}
var locs = j.localitati.Select(item => new { item.id,item.denumire }).OrderBy(item =>
item.denumire).ToList();
string json = JsonConvert.SerializeObject(locs);
return Content(json,"application/json");
}
//TODO validariiiiii emailu sa fie unic in tabelu useri
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Inregistrare(InregistrareViewModel model)
{
model.JudetSelectat = model.utilizator.judet_id;
model.LocalitateSelectata = model.utilizator.localitate_id;
if (model.JudetSelectat != -1)
{
model.Localitati = db.localitate.Where(l => l.judet_id == model.JudetSelectat).OrderBy(l =>
l.denumire).ToList();
}
else
70 {
model.Localitati = new List<localitate>();
}
model.Localitati.Add(new localitate { id = -1, denumire = "–" });
if (!ModelState.IsValid)
{
return View("~/Views/Front/Inregistrare.cshtml", model);
}
int c = db.utilizator.Where(u => u.email == model.utilizator.email).Count();
if (c > 0)
{
model.avertismente.Add("DEJA EXIST Ă UN UTILIZATOR CU ACEAST Ă ADRESĂ DE E-MAIL.
LOGGED IP & LOCATION!");
return View("~/Views/Front/Inregistrare.cshtml", model);
}
model.utilizator.parola = utilizator.md5pw(model.utilizator.parola);
db.utilizator.Add(model.utilizator);
db.SaveChanges();
ModelState.Clear();
ViewBag.nume = model.utilizator.nume;
ViewBag.prenume = model.utilizator.prenume;
return View("~/Views/Front/InregistrareSucces.cshtml", new FrontViewModel());
}
[HttpGet]
public ActionResult Login()
{
return View("~/Views/Front/Login.cshtml",new FrontViewModel());
}
[HttpPost]
71 public ActionResult Login(FrontViewModel fvm)
{
if (!ModelState.IsValid)
{
fvm.erori.Add("Au aparut erori la procesare!");
return View("~/Views/Front/Login.cshtml",fvm);
}
string email = fvm.email;
string parola = utilizator.md5pw(fvm.parola);
utilizator user = db.utilizator.Where(u => u.email == email).Where(u => u.parola ==
parola).FirstOrDefault();
if (user == null)
{
fvm.erori.Add("Login invalid!");
return View("~/Views/Front/Login.cshtml",fvm);
}
FormsAuthentication.RedirectFromLoginPage(user.email, true);
return null;
}
[HttpGet]
public ActionResult Logout()
{
FormsAuthentication.SignOut();
return RedirectToRoute("Home");
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
72Models
AdaugareAnuntViewModel.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Site_Licitatii_ASP.NET_MVC_5.Models
{
public class AdaugareAnuntViewModel:FrontViewModel
{
public anunt anunt { get; set; }
[Display(Name="Categorie")]
[Range(1,int.MaxValue,ErrorMessage="Categorie invalida!")]
public int CategorieMinoraSelectata { get; set; }
public List<SelectListItem> selitm;
public HttpPostedFileBase poze;
public AdaugareAnuntViewModel()
{
List<categoriemajora> categmaj = db.categoriemajora.OrderBy(c => c.denumire).ToList();
selitm = new List<SelectListItem>();
foreach (categoriemajora cmaj in categmaj)
{
SelectListItem majora = new SelectListItem();
majora.Disabled = true;
majora.Text = cmaj.ToString();
majora.Value = -1 + "";
selitm.Add(majora);
//children
List<categorieminora> minore = cmaj.categoriiminore.OrderBy(c => c.denumire).ToList();
foreach (categorieminora cmin in minore)
{
SelectListItem minora = new SelectListItem();
minora.Disabled = false;
73 minora.Value = cmin.id + "";
minora.Text = cmin.denumire;
selitm.Add(minora);
}
}
AdminAnunturiViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PagedList;
namespace Site_Licitatii_ASP.NET_MVC_5.Models
{
public class AdminAnunturiViewModel : FrontViewModel
{
public IPagedList<anunt> anunturi;
}
}
AnuntViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Site_Licitatii_ASP.NET_MVC_5.Models
{
public class AnuntViewModel:FrontViewModel
{
public anunt anunt { get; set; }
}
}
FrontViewModel.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
74using System.Web;
namespace Site_Licitatii_ASP.NET_MVC_5.Models
{
public class FrontViewModel
{
protected Entities db { get; set; }
public List<categoriemajora> categoriimajore { get; set; }
public List<string> erori { get; set; }
public List<string> avertismente { get; set; }
public List<string> mesaje { get; set; }
[EmailAddress(ErrorMessage="Adresa de e-mail invalida")]
public String email { get; set; }
public String parola { get; set; }
public FrontViewModel()
{
db = new Entities();
//pt navigare
categoriimajore = db.categoriemajora.OrderBy(c => c.denumire).ToList();
erori = new List<string>();
mesaje = new List<string>();
avertismente = new List<string>();
}
}
}
Helper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Site_Licitatii_ASP.NET_MVC_5.Models
{
public class Helper
{
75 public static utilizator userLogat()
{
if (HttpContext.Current.User == null || HttpContext.Current.User.Identity == null)
{
return null;
}
Entities db = new Entities();
return db.utilizator.Where(u => u.email == HttpContext.Current.User.Identity.Name).FirstOrDefault();
}
}
}
ÎnregistrareViewModel.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace Site_Licitatii_ASP.NET_MVC_5.Models
{
public class InregistrareViewModel:FrontViewModel
{
public utilizator utilizator { get; set; }
public List<judet> Judete { get; set; }
public List<localitate> Localitati { get; set; }
public int JudetSelectat { get; set; }
public int LocalitateSelectata { get; set; }
public InregistrareViewModel():base()
{
JudetSelectat = -1;
LocalitateSelectata = -1;
Judete = db.judet.OrderBy(j => j.denumire).ToList();
Judete.Insert(0,new judet { id = -1, denumire = "–" });
Localitati = new List<localitate>();
Localitati.Add(new localitate { id = -1, denumire = "–" });
}
}
}
76ListăAnunțuriViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PagedList;
namespace Site_Licitatii_ASP.NET_MVC_5.Models
{
public class ListaAnunturiViewModel:FrontViewModel
{
public string cautare { get; set; }
public categorieminora categorie { get; set; }
public string titlu { get; set; }
public IPagedList<anunt> anunturi;
public Func<int, string> linkpaginare { get; set; }
}
}
Anunt.js
function refresh_pret() {
$.ajax({
url: "/Anunt/" + anunt_id + "/Refresh",
async: false,
cache: false,
success: function (rdata) {
if (rdata.succes) {
$('#pret').text(rdata.pret);
}
}
});
}
$(document).ready(function () {
$('.formbid').submit(function () {
var pretvechi = $('#pret').text() * 1.0;
var pretnou = $('#bid').val() * 1.0;
if (pretvechi >= pretnou) {
alert("Bid-ul nou trebuie sa depaseasca cel mai mare bid vechi!");
77 return false;
}
$.ajax({
url: $(this).attr("action"),
type: 'POST',
data: 'bid=' + pretnou,
success: function (rdata) {
if (!rdata.succes) {
alert(rdata.eroare);
} else {
$('#pret').text(pretnou);
alert("Ati licitat cu succes!");
}
}
});
return false;
});
Inregistrare,js
$(document).ready(function() {
$('#utilizator_judet_id').change(function() {
if ($(this).val() == -1) {
$('#utilizator_localitate_id').html("<option selected value=\"-1\">–</option>");
return;
}
var judet_id = $(this).val();
$.ajax({
url: '/Localitati/' + judet_id,
success: function(localitati) {
$('#utilizator_localitate_id').html("<option selected value=\"-1\">–</option>");
for (var i = 0;i<localitati.length;i++) {
var html = '<option value="'+localitati[i].id+'">'+localitati[i].denumire+'</option>';
$('#utilizator_localitate_id').append(html);
}
}
});
});
});
78View
AdaugareAnunt.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@model AdaugareAnuntViewModel
@{
ViewBag.TitluPagina = "Adaugare anunt";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
@using (Html.BeginForm("AdaugareAnunt","Anunturi",FormMethod.Post,new{enctype="multipart/form-data"}))
{
@Html.AntiForgeryToken()
@:<div class="form-group">
@Html.ValidationMessageFor(m=>m.anunt.titlu)
@Html.LabelFor(m=>m.anunt.titlu)
@Html.TextBoxFor(m => m.anunt.titlu, new {@class="input input-lg form-control"})
@:</div>
@:<div class="form-group">
@Html.ValidationMessageFor(m=>m.anunt.e_licitatie)
@Html.LabelFor(m=>m.anunt.e_licitatie)
@Html.CheckBoxFor(m => m.anunt.e_licitatie, new { @checked="checked"})
@:</div>
@:<div class="form-group">
@Html.ValidationMessageFor(m=>m.anunt.negociabil)
@Html.LabelFor(m => m.anunt.negociabil)
@Html.CheckBoxFor(m => m.anunt.negociabil)
@:</div>
@:<div class="form-group">
@Html.ValidationMessageFor(m=>m.anunt.descriere)
@Html.LabelFor(m=>m.anunt.descriere)
@Html.TextAreaFor(m => m.anunt.descriere, new { @class = "input form-control" })
@:</div>
@:<div class="form-group">
@Html.ValidationMessageFor(m=>m.CategorieMinoraSelectata)
@Html.LabelFor(m=>m.CategorieMinoraSelectata)
@Html.DropDownListFor(m => m.CategorieMinoraSelectata, Model.selitm, new { @class="input form-
control"})
@:</div>
79
@:<div class="form-group">
@Html.ValidationMessageFor(m=>m.anunt.pret)
@Html.LabelFor(m=>m.anunt.pret)
@Html.TextBoxFor(m => m.anunt.pret, new { @class = "input input-lg form-control" })
@:</div>
@:<div class="form-group">
@Html.Label("Poze")
<input type="file" multiple name="poze" class="form-control input" accept="image/*" />
@:</div>
@:<input type="submit" class="btn btn-lg btn-primary center-block" value="Adaugare anunt" />
}
AdminAnunturi.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@using PagedList.Mvc
@model AdminAnunturiViewModel
@{
ViewBag.TitluPagina = "Anun țurile mele";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
@if (Model.anunturi.Count == 0)
{
@:<div class="alert alert-warning">Niciun anun ț inca!</div>
}
else
{
@:<table class="table table-condensed table-responsive">
@:<thead>
@:<tr>
@:<td>Poz ă</td>
@:<td>Titlu</td>
@:<td>Categorie</td>
80 @:<td>Ofertant</td>
@:<td>Tip</td>
@:<td>Pre ț/Preț minim</td>
@:<td>Cea mai mare licita ție</td>
@:<td>Dat ă adaugare</td>
@:<td>Dat ă finalizare</td>
@:<td>Câ știgător</td>
@:<td> Ștergere</td>
@:</tr>
@:</thead>
@:<tbody>
foreach (anunt a in Model.anunturi)
{
@:<tr class="randlink" onclick="location.href='@Url.RouteUrl("VizualizareAnunt", new { id = a.id})'">
if (a.poze.Count == 0)
{
@:<td>-</td>
}
else
{
@:<td><img class="img-mica" src="@a.poze.First().cale_fisier" /></td>
}
@:<td>@a.titlu</td>
@:<td>@a.categorieanunt.categoriemajora.denumire > @a.categorieanunt.denumire</td>
@:<td>@a.proprietar.nume</td>
if (a.e_licitatie)
{
@:<td>LICITA ȚIE</td>
}
else
{
@:<td>ANUN Ț</td>
}
@:<td>@a.pret RON</td>
if (a.biduri.Count == 0)
{
@:<td>- RON</td>
}
else
{
@:<td>@a.biduri.Max(b=>b.suma) RON</td>
}
@:<td>@a.data_adaugare.ToString("dd/MM/yyyy, HH:mm:ss")</td>
if (a.data_finalizare.HasValue)
{
@:<td>@a.data_finalizare.Value.ToString("dd/MM/yyyy, HH:mm:ss")</td>
81 }
else
{
@:<td>NEF.</td>
}
Entities db = new Entities();
var cumparator = db.utilizator.Find(a.cumparator_id);
@:<td>
if (cumparator == null)
{
@:Nimeni
}
else {
@cumparator.email @:<br />
@cumparator.nume @cumparator.prenume <br />
@cumparator.telefon
}
@:</td>
@:<td>
@:<a href="@Url.RouteUrl("StergereAnunt", new {id=a.id})" class="center-block"><span
class="glyphicon glyphicon-remove"></span></a>
@:</td>
@:</tr>
}
@:</tbody>
@:</table>
if (Model.anunturi.HasNextPage || Model.anunturi.HasPreviousPage)
{
@Html.PagedListPager(Model.anunturi, page => Url.RouteUrl("AdminAnunturi", new { pag=page}));
}
}
Anunt.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@model AnuntViewModel
@{
ViewBag.TitluPagina = Model.anunt.titlu;
Layout = "~/Views/Shared/FrontLayout.cshtml";
82}
<h3 class="page-header">Descriere</h3>
<p><b>
Tip:
@if (Model.anunt.e_licitatie)
{
@:licitatie
}
else
{
@:anunt
}
</b></p>
<p>@Model.anunt.descriere</p>
<br />
@if (Model.anunt.poze.Count > 0) {
@:<h3 class="page-header">Imagini</h3>
@:<ul class="listapoze">
int i = 0;
foreach (poza poza in Model.anunt.poze)
{
<li><a href="@poza.cale_fisier" data-lightbox="img-@i++">
<img class="img-mica" src="@poza.cale_fisier" />
</a></li>
}
@:</ul>
@:<div class="clearfix"></div>
@:<br />
}
<h3 class="page-header">Pre ț</h3>
@if (!Model.anunt.e_licitatie)
{
@:Pret: @Model.anunt.pret RON
if (Model.anunt.negociabil)
{
@:(negociabil)
}
@:<br />
if (Request.IsAuthenticated) {
@:<a href="@Url.RouteUrl("Cumparare", new { id=Model.anunt.id})"><button class="btn btn-lg btn-primary
center-block">Cump ără</button></a>
}
else
{
<div class="alert alert-warning">Pentru a putea cump ăra, vă rugăm să vă <a
href="@Url.RouteUrl("Login")">autentifica ți</a>.</div>
83 }
@:<script type="text/javascript">var e_licitatie = false;</script>
}
else
{
@:Preț minim: @Model.anunt.pret RON <br/>
@:<b>Cea mai mare licita ție:
if (Model.anunt.biduri.Count == 0)
{
@:<div id="pret">@Model.anunt.pret</div> RON
}
else
{
@:<div id="pret">@Model.anunt.biduri.Max(b=>b.suma)</div> RON
}
@:</b>
if (Request.IsAuthenticated) {
using (Html.BeginForm("Bid", "Anunturi", FormMethod.Post, new {@class="formbid"}))
{
@Html.Label("Bid:")
@:@Html.TextBox("bid") RON
@:<input type="submit" class="btn btn-primary" value="Liciteaza"/>
}
}
else
{
<div class="alert alert-warning">Pentru a putea licita, v ă rugăm să vă <a
href="@Url.RouteUrl("Login")">autentifica ți</a>.</div>
}
@:<script type="text/javascript">var e_licitatie = true;</script>
}
<br /><br />
<h3 class="page-header">Date de contact vânz ător</h3>
<table border="0">
<tr><td class="bold">Nume:</td><td>@Model.anunt.proprietar.nume
@Model.anunt.proprietar.prenume</td></tr>
<tr><td class="bold">Tel.:</td><td>@Model.anunt.proprietar.telefon</td></tr>
<tr><td class="bold">E-Mail:</td><td>@Model.anunt.proprietar.email</td></tr>
<tr><td class="bold">Adres ă:</td><td>@Model.anunt.proprietar.adresa , localitatea
@Model.anunt.proprietar.localitate.denumire , jude țul @Model.anunt.proprietar.judet.denumire</td></tr>
</table>
@section stiluri {
84 <link rel="stylesheet" media="all" type="text/css" href="~/Scripts/lightbox/css/lightbox.css" />
}
@section scripturiheader {
<script type="text/javascript" src="~/Scripts/lightbox/js/lightbox.min.js"></script>
<script type="text/javascript">
var anunt_id = @Model.anunt.id ;
</script>
}
@section scripturifooter {
<script type="text/javascript" src="~/Scripts/anunt.js"></script>
}
ConfirmareCumparare.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@model FrontViewModel
@{
ViewBag.TitluPagina = "Confirmare cump ărare";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
<div class="alert alert-success">
Felicitări! Ați cumpărat produsul! <br />
DATE PLATA AICI
</div><br />
<a href="@Url.RouteUrl("Home")"><button class="btn btn-lg btn-primary center-block">Înapoi
acasă</button></a>
Home.cshtml
@{
ViewBag.TitluPagina = "Acas ă – ultimele anun țuri/licitații";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
Inregistrare.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@model InregistrareViewModel
@{
ViewBag.TitluPagina = "Înregistrare Utilizator";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
<div class="row">
85 <div class="col-lg-6 col-lg-offset-3">
@using (Html.BeginForm("Procesare", "Inregistrare", FormMethod.Post, new { @class = "form" }))
{
@Html.ValidationSummary(true, "Înregistrare e șuată. Verifica ți câmpurile!", new {@class="alert alert-
warning" })
<div class="form-group">
@Html.ValidationMessageFor(model => model.utilizator.nume)
@Html.LabelFor(model => model.utilizator.nume, "Nume:")
@Html.TextBoxFor(model => model.utilizator.nume, new { @class = "input form-control" })
</div>
<div class="form-group">
@Html.ValidationMessageFor(model => model.utilizator.prenume)
@Html.LabelFor(model => model.utilizator.prenume, "Prenume:")
@Html.TextBoxFor(model => model.utilizator.prenume, new { @class = "input form-control" })
</div>
<div class="form-group">
@Html.ValidationMessageFor(model => model.utilizator.email)
@Html.LabelFor(model => model.utilizator.email, "E-Mail:")
@Html.TextBoxFor(model => model.utilizator.email, new { @class = "input form-control" })
</div>
<div class="form-group">
@Html.ValidationMessageFor(model => model.utilizator.parola)
@Html.LabelFor(model => model.utilizator.parola, "Parola:")
@Html.PasswordFor(model => model.utilizator.parola, new { @class = "input form-control" })
</div>
<div class="form-group">
@Html.ValidationMessageFor(model => model.utilizator.telefon)
@Html.LabelFor(model => model.utilizator.telefon, "Telefon:")
@Html.TextBoxFor(model => model.utilizator.telefon, new { @class = "input form-control" })
</div>
<div class="form-group">
@Html.ValidationMessageFor(model => model.utilizator.adresa)
@Html.LabelFor(model => model.utilizator.adresa, "Adres ă:")
@Html.TextAreaFor(model => model.utilizator.adresa, new { @class = "input form-control" })
</div>
<div class="form-group">
@Html.ValidationMessageFor(model=>model.utilizator.judet_id)
@Html.LabelFor(model => model.utilizator.judet_id, "Jude ț:")
@Html.DropDownListFor(model => model.utilizator.judet_id, new SelectList(Model.Judete, "id",
"denumire", Model.JudetSelectat), new {@class="form-control input" })
</div>
<div class="form-group">
@Html.ValidationMessageFor(model => model.utilizator.localitate_id)
@Html.LabelFor(model => model.utilizator.localitate_id, "Localitate:")
@Html.DropDownListFor(model => model.utilizator.localitate_id, new SelectList(Model.Localitati, "id",
"denumire", Model.LocalitateSelectata), new { @class = "form-control input" })
86 </div>
@Html.AntiForgeryToken()
<input type="submit" class="btn btn-lg btn-primary center-block" value="Înregistrare"/>
}
</div>
</div>
<div class="clearfix"></div>
@section scripturifooter {
<script type="text/javascript" src="~/Scripts/inregistrare.js"></script>
InregistrareSucces.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@model FrontViewModel
@{
ViewBag.Title = "Înregistrare reusita!";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
<div class="alert alert-success">Felicit ări, @ViewBag.nume @ViewBag.prenume ! Tocmai v-a ți creat un cont pe
site. Puteți acum să vă logați folosind meniul de sus.<br/>
<a href="@Url.RouteUrl("Home")">
ACAS Ă
</a>
</div>
ListaAnunturi.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@using PagedList.Mvc
@model ListaAnunturiViewModel
@{
ViewBag.TitluPagina = Model.titlu;
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
@if (Model.anunturi.Count == 0)
{
@:<div class="alert alert-warning">Niciun anun ț încă!</div>
}
87else
{
@:<table class="table table-condensed table-responsive">
@:<thead>
@:<tr>
@:<td>Poza</td>
@:<td>Titlu</td>
@:<td>Ofertant</td>
@:<td>Tip</td>
@:<td>Pre ț/Preț minim</td>
@:<td>Cea mai mare licita ție</td>
@:<td>Dat ă adaugare</td>
@:<td>Dat ă finalizare</td>
@:</tr>
@:</thead>
@:<tbody>
foreach (anunt a in Model.anunturi)
{
@:<tr class="randlink" onclick="location.href='@Url.RouteUrl("VizualizareAnunt", new { id = a.id})'">
if (a.poze.Count == 0)
{
@:<td>-</td>
}
else
{
@:<td><img class="img-mica" src="@a.poze.First().cale_fisier" /></td>
}
@:<td>@a.titlu</td>
@:<td>@a.proprietar.nume</td>
if (a.e_licitatie)
{
@:<td>LICITA ȚIE</td>
}
else
{
@:<td>ANUN Ț</td>
}
@:<td>@a.pret RON</td>
if (a.biduri.Count == 0)
{
@:<td>- RON</td>
}
else
{
@:<td>@a.biduri.Max(b=>b.suma) RON</td>
}
88
@:<td>@a.data_adaugare.ToString("dd/MM/yyyy, HH:mm:ss")</td>
if (a.data_finalizare.HasValue)
{
@:<td>@a.data_finalizare.Value.ToString("dd/MM/yyyy, HH:mm:ss")</td>
}
else
{
@:<td>NEF.</td>
}
@:</tr>
}
@:</tbody>
@:</table>
if (Model.anunturi.HasNextPage || Model.anunturi.HasPreviousPage)
{
@Html.PagedListPager(Model.anunturi, Model.linkpaginare);
}
}
Login.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@model FrontViewModel
@{
ViewBag.TitluPagina = "Login";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
<div class="row">
<div class="col-lg-6 col-lg-offset-3">
@using (@Html.BeginForm("Login", "Utilizator", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.ValidationMessageFor(m => m.email)
@Html.LabelFor(m => m.email, "E-Mail:")
@Html.TextBoxFor(m => m.email, new { @class = "form-control input" })
</div>
<div class="form-group">
@Html.ValidationMessageFor(m => m.parola)
@Html.LabelFor(m => m.parola, "Parola:")
@Html.PasswordFor(m => m.parola, new { @class = "form-control input" })
89 </div>
<input type="submit" value="Login" class="btn btn-lg btn-primary center-block" />
}
</div>
</div>
Eroare.cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@model FrontViewModel
@{
ViewBag.TitluPagina = "Eroare";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
FrontLayout.cshtml
@using Site_Licitatii_ASP.NET_MVC_5
@model Site_Licitatii_ASP.NET_MVC_5.Models.FrontViewModel
@{
Layout = "~/Views/Shared/PagGoala.cshtml";
}
@section nav {
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapsible">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="@Url.RouteUrl("Home")">Licita ții</a>
</div>
<div class="navbar-collapse collapse" id="navbar-collapsible">
<ul class="nav navbar-nav navbar-left">
<li class="dropdown">
<a href="#" data-toggle="dropdown">Categorii produse <b class="caret"></b></a>
<ul class="dropdown-menu">
90 @foreach (categoriemajora cmaj in Model.categoriimajore)
{
@:<li class="dropdown-submenu">
@:<a href="#" tabindex="-1" data-toggle="dropdown">@cmaj.denumire</a>
@:<ul class="dropdown-menu">
var categoriiminore = cmaj.categoriiminore.OrderBy(cmin => cmin.denumire);
foreach (categorieminora cmin in categoriiminore)
{
@:<li><a href="@Url.RouteUrl("AnunturiCategorie", new { catid=cmin.id })"
tabindex="-1">@cmin.denumire</a></li>
}
@:</ul>
@:</li>
}
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
@if (!Request.IsAuthenticated)
{
@:<li class="dropdown">
@:<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-
expanded="false">
@:Login
@:<span class="caret"></span>
@:</a>
@:<div class="dropdown-menu container-login">
using (Html.BeginForm("Login", "Utilizator", FormMethod.Post))
{
@Html.AntiForgeryToken()
@:<div class="form-group">
@Html.LabelFor(model => Model.email)
@Html.TextBoxFor(model => Model.email, new { @class = "input input-sm form-control"
});
@:</div>
@:<div class="form-group">
@Html.LabelFor(model => Model.parola)
@Html.PasswordFor(model => Model.parola, new { @class = "input input-sm form-control" });
91 @:</div>
@:<input type="submit" class="btn btn-primary center-block" value="Login" />
}
@:<br />
@:<a class="col-sm-12 text-center" href="@Url.RouteUrl("Inregistrare", new
{controller="Utilizator", action="Inregistrare"})"><span class="glyphicon glyphicon-registration-
mark"></span>Creaz ă cont</a>
@:</div>
@:</li>
}
else
{
@:<li class="dropdown">
@:<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-
expanded="false">
var username = "Meniu";
@username
@:<span class="caret"></span>
@:</a>
@:<ul class="dropdown-menu">
@:<li><a href="@Url.RouteUrl("AdaugareAnunt")">Adaugare anun ț</a></li>
@:<li><a href="@Url.RouteUrl("AdminAnunturi")">Anun țurile mele</a></li>
@:<li><a href="@Url.RouteUrl("Logout")">Logout</a></li>
@:</ul>
@:</li>
}
92 </ul>
<form method="GET" action="@Url.RouteUrl("Cautare")" class="navbar-form">
<div class="form-group" style="display:inline;">
<div class="input-group">
<input type="text" name="q" class="form-control">
<span class="input-group-addon" onclick=""><span class="glyphicon glyphicon-
search"></span></span>
</div>
</div>
</form>
</div>
<!– /.nav-collapse –>
</div>
<!– /.container-fluid –>
</nav>
}
<div class="container">
<h2 class="page-header">@ViewBag.TitluPagina</h2>
<div class="continut">
@foreach (string mesaj in Model.mesaje)
{
@:<div class="alert alert-success">
@mesaj
@:</div>
}
@foreach (string avertisment in Model.avertismente)
{
@:<div class="alert alert-warning">
@avertisment
@:</div>
}
@foreach (string eroare in Model.erori)
{
@:<div class="alert alert-danger">
@eroare
@:</div>
}
93 @RenderBody()
</div>
<footer class="footer">
Copyright © 2015 Ghiocel Adrian, UPIT.
</footer>
</div>
@section stiluri {
@RenderSection("stiluri", false)
}
@section scripturifooter {
@RenderSection("scripturifooter", false)
}
@section scripturiheader {
@RenderSection("scripturiheader", false)
}
Info,cshtml
@using Site_Licitatii_ASP.NET_MVC_5.Models
@model FrontViewModel
@{
ViewBag.TitluPagina = "Informa ție";
Layout = "~/Views/Shared/FrontLayout.cshtml";
}
PagGoala.cshtml
<!doctype html>
<html>
<head>
<title>@ViewBag.TitluPagina</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" media="all" type="text/css" href="~/Content/css/bootstrap.min.css" />
<link rel="stylesheet" media="all" type="text/css" href="~/Content/css/d.css" />
<link rel="stylesheet" media="all" type="text/css" href="~/Content/css/stil.css" />
@RenderSection("stiluri", false)
<script type="text/javascript" src="~/Scripts/jquery.js"></script>
94 <script type="text/javascript" src="~/Scripts/bootstrap.min.js"></script>
<script type="text/javascript" src="~/Scripts/d.js"></script>
<script type="text/javascript" src="~/Scripts/global.js"></script>
@RenderSection("scripturiheader", false)
</head>
<body>
<div class="wrapper">
<div class="toatapagina container-fluid">
@RenderSection("nav",true)
@RenderBody()
</div>
</div>
@RenderSection("scripturifooter", false)
</body>
</html>
web.config
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor"
type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor,
Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection,
System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection,
System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.2.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
95 <pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="Site_Licitatii_ASP.NET_MVC_5" />
</namespaces>
</pages>
</system.web.webPages.razor>
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
<system.webServer>
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"
type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>
Model.tt
anunt.cs
namespace Site_Licitatii_ASP.NET_MVC_5
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public partial class anunt
{
public anunt()
{
this.biduri = new HashSet<bid>();
this.poze = new HashSet<poza>();
}
96 public int id { get; set; }
public int utilizator_id { get; set; }
[MinLength(3,ErrorMessage="Titlu invalid")]
[Required(ErrorMessage = "Titlul este obligatoriu")]
[Display(Name="Titlu")]
public string titlu { get; set; }
public int categorieminora_id { get; set; }
[Display(Name="Descriere")]
[Required(ErrorMessage="Descrierea este obligatorie")]
public string descriere { get; set; }
public System.DateTime data_adaugare { get; set; }
[Display(Name="Este licita ție?")]
public bool e_licitatie { get; set; }
[Display(Name="Pre ț")]
[Required(ErrorMessage = "Pre țul este obligatoriu")]
public double pret { get; set; }
[Display(Name="Pre ț negociabil")]
public bool negociabil { get; set; }
public Nullable<System.DateTime> data_finalizare { get; set; }
public Nullable<int> cumparator_id { get; set; }
public bool finalizat { get; set; }
public virtual utilizator proprietar { get; set; }
public virtual categorieminora categorieanunt { get; set; }
public virtual ICollection<bid> biduri { get; set; }
public virtual ICollection<poza> poze { get; set; }
}
}
bid.cs
namespace Site_Licitatii_ASP.NET_MVC_5
{
using System;
using System.Collections.Generic;
public partial class bid
{
97 public int id { get; set; }
public int anunt_id { get; set; }
public int utilizator_id { get; set; }
public System.DateTime data { get; set; }
public double suma { get; set; }
public virtual anunt anunt { get; set; }
public virtual utilizator utilizator { get; set; }
}
}
categoriemajora.cs
namespace Site_Licitatii_ASP.NET_MVC_5
{
using System;
using System.Collections.Generic;
public partial class categoriemajora
{
public categoriemajora()
{
this.categoriiminore = new HashSet<categorieminora>();
}
public int id { get; set; }
public string denumire { get; set; }
public virtual ICollection<categorieminora> categoriiminore { get; set; }
public override string ToString()
{
return ">>>>" + denumire + "<<<<";
}
}
}
categorieminora.cs
namespace Site_Licitatii_ASP.NET_MVC_5
{
using System;
using System.Collections.Generic;
98 public partial class categorieminora
{
public categorieminora()
{
this.anunturi = new HashSet<anunt>();
}
public int id { get; set; }
public int categoriemajora_id { get; set; }
public string denumire { get; set; }
public virtual ICollection<anunt> anunturi { get; set; }
public virtual categoriemajora categoriemajora { get; set; }
}
}
judet.cs
namespace Site_Licitatii_ASP.NET_MVC_5
{
using System;
using System.Collections.Generic;
public partial class judet
{
public judet()
{
this.localitati = new HashSet<localitate>();
this.utilizatori = new HashSet<utilizator>();
}
public int id { get; set; }
public string denumire { get; set; }
public virtual ICollection<localitate> localitati { get; set; }
public virtual ICollection<utilizator> utilizatori { get; set; }
}
}
localitate.cs
namespace Site_Licitatii_ASP.NET_MVC_5
{
using System;
using System.Collections.Generic;
99
public partial class localitate
{
public localitate()
{
this.utilizatori = new HashSet<utilizator>();
}
public int id { get; set; }
public int judet_id { get; set; }
public string denumire { get; set; }
public virtual judet judet { get; set; }
public virtual ICollection<utilizator> utilizatori { get; set; }
}
}
poza.cs
namespace Site_Licitatii_ASP.NET_MVC_5
{
using System;
using System.Collections.Generic;
public partial class poza
{
public int id { get; set; }
public int anunt_id { get; set; }
public string cale_fisier { get; set; }
public virtual anunt anunt { get; set; }
}
}
utilizator.cs
namespace Site_Licitatii_ASP.NET_MVC_5
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Security.Cryptography;
using System.Text;
public partial class utilizator
100 {
public utilizator()
{
this.anunturi = new HashSet<anunt>();
this.biduri = new HashSet<bid>();
}
public static string md5pw(string input)
{
// step 1, calculate MD5 hash from input
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
// step 2, convert byte array to hex string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString().ToLower();
}
public int id { get; set; }
[Required(ErrorMessage = "Câmpul E-Mail este obligatoriu!")]
[Display(Name = "E-Mail")]
[MinLength(3, ErrorMessage = "E-Mail-ul trebuie sa con țina minim 3 caractere")]
[EmailAddress(ErrorMessage = "E-Mail invalid!")]
public string email { get; set; }
[MinLength(6, ErrorMessage = "Minim 6 caractere!")]
[Required(ErrorMessage = "Parola este obligatorie!")]
[Display(Name = "Parola")]
public string parola { get; set; }
[Required(ErrorMessage = "Numele este obligatoriu!")]
[Display(Name = "Nume")]
public string nume { get; set; }
101
[Display(Name = "Prenume")]
[Required(ErrorMessage = "Prenumele este obligatoriu!")]
public string prenume { get; set; }
[MinLength(10, ErrorMessage = "Telefon invalid!")]
[Display(Name = "Telefon")]
[Phone(ErrorMessage = "Numarul de telefon este invalid")]
public string telefon { get; set; }
[Display(Name = "Adres ă")]
public string adresa { get; set; }
[Display(Name = "Jude ț")]
[Required(ErrorMessage = "Jude țul este obligatoriu!")]
[Range(1, int.MaxValue, ErrorMessage = "Jude ț invalid!")]
public int judet_id { get; set; }
[Display(Name = "Localitate")]
[Required(ErrorMessage = "Localitatea este obligatorie!")]
[Range(1, int.MaxValue, ErrorMessage = "Localitate invalid ă!")]
public int localitate_id { get; set; }
public bool e_vip { get; set; }
public System.DateTime data_inregistrare { get; set; }
public virtual ICollection<anunt> anunturi { get; set; }
public virtual ICollection<bid> biduri { get; set; }
public virtual judet judet { get; set; }
public virtual localitate localitate { get; set; }
}
}
102Bibliografie
F. Ipate, M. Popescu: Dezvoltarea Aplicatiilor de Baze de Date cu
Oracle 8 si Forms 6, Editura All, 2000.
Robert Dollinger, Lucian Andron , Utilizarea Sistemului SQL
SERVER, 2004, Editura Albastr ă
Stephen Wynkoop, Totul despre Microsoft SQL Server 7.0, 2000, Ed.
Teora, Bucure ști
Charles Petzold, Programare în Windows cu C#, Editura Teora, 2003.
Chris Pappas, William Murray, C# pentru programarea Web, Editura
ALL, 2004.
Paul DuBOIS (Traducere de Mihai M ănăstireanu), MySQL
Nimit Joshi, Programming ASP.NET MVC 5 (C# Corner November
2013)
Mircea Bolo șteanu Suport curs anul III Dezvoltare Web
Viorel Păun Suport curs anul II Sisteme de gestiune a bazelor de date
Revista Market Watch
www.oracle.com
www.mysql.com
www.asp.net
103
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Specializarea Informatic ă [631526] (ID: 631526)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
