|modeli i aplikacionit per blerje online

66
Fakulteti i shkencave matematiko natyrore Punim diplome: “ Modeli i aplikacionit për blerje online” Mentor: Kandidatja:

description

ddd

Transcript of |modeli i aplikacionit per blerje online

Fakulteti i shkencave matematiko natyrore

Punim diplome: Modeli i aplikacionit pr blerje online

Mentor: Kandidatja:Prof.Dr. Edmond Beqiri Rilinda Abazi

Tetov, Janar 2014

1.Abstrakti

Ky punim sht pr secilin i cili dshiron t msoj se si t ndrtoj web faqe interaktive e cila ekzekutohet n platformn e mikrosoftit. Me njohurit q do t fitojm nga ky punim, do t kemi mundsi t krijojm fardoqoft aplikacioni q do t na jepet, duke filluar nga disa hobi q i kemi pr faqet e internetit ne do t mund q t krijojm faqe pr qllime komerciale.N kt punim do t msojm se si t krijojm nj website t ri dhe si t shtojm faqe n kt website, t manipulojm me kto, t shtojm kontrolle, stile, navigimet n internet dhe shum gjra t tjera q do t na mundsojn pr ta br nj web aplikacion komplet. Nga prmbajtja q do t pasoj gradualisht do t njihemi me teknologjit e reja, dhe hap pas hapi do t tregojm se si ndrtohet nj aplikacion. T gjith shembujt n kt punim jan t prezantuara n gjuhn programore C#. Ky punim ka pr qllim q zhvilluesit t cilt krkojn nj tutorial pr t ndrtuar nj e-commerce web site do ta gjejn prgjigjen n kt website komplet.

Prmbajtja1.Abstrakt2Hyrje4Pjesa kryesore5Krijimi i ASP.NET web faqes s par5Krijimi i master page-it8Krijimi i Content Page10Validimi i t dhnave t prdoruesit ( Validating user inputs )13Validating user inputs in web forms13The ASP.NET validation control13Client and server side validation method17Hyrje n databaz19ka sht databaza ?19Diagramet dhe lidhja e tabelave19ka jan primary keys dhe identities20Krijimi i tabels Department20Stored Procedures20Shtimi i Categories dhe Products n databaz27Shfaqja e lists me produkte34PayPal shopping cart36Administrimi i departamenteve dhe kategorive39Administrimi i departamenteve43Administrimi i kategorive46Administrimi i produkteve47Ndrtimi i nj lidhje t sigurt50Sigurimi i SSL ertifikats nga VeriSign51Prfundimi52Literatura53

Hyrje

Pr t ndrtuar nj web aplikacion me databaz efektive dhe trheqse, do t kemi nevoj pr dy gjra: nj framework t shpejt pr t ekzekutuar web faqet dhe nj ambient t pasur dhe t gjr pr t krijuar dhe programuar kto web faqe. Me ASP.NET 4.5 dhe Visual Studio 2012 i arrijm kto qllime. S bashku kto formojn nj platform dinamike dhe interaktive pr krijimin e web faqeve. ASP.NET sht me t vrtet nj teknologji unike, dhe ajo ofron mnyra t reja dhe tejet efikase pr t krijuar web aplikacione duke prdorur gjuhn e programimit me t ciln ne do t ndjehemi m t rehatshm. Edhe pse kjo mund t marr disa koh pr ta msuar, ASP.NET sht i thjesht pr tu prdorur. Nse ne dshirojm q t krijojm web forma t thjeshta, shopping karta, apo edhe aplikacione m komlekse, ASP.NET na mundson q ti arrijm kto. ASP.NET sht platform e mikrosoftit pr ndrtimin e web aplikacioneve. ASP.NET sht teknologji e gjenerats s ardhshme t mikrosoftit pr krijimin e server side web aplikacioneve, si e tham edhe m hert sht e ndrtuar n Mikrosoft .NET framework i cili sht nj grup i teknologjive t lidhura ngusht q revolucionarizojn gjithka nga qasja e t dhnave n aplikacione t shprndara. ASP.NET sht nj nga komponentet m t rndsishme t .NET framework- ut. .NET framework sht pjesa e cila na mundson zhvillimin e aplikacioneve me performansa t larta, dhe nuk sht shum vshtir q ti bjsh zhvilluesit t jen t interesuar n ASP.NET. Pa ekzagjerim, ASP.NET sht platforma m e plot pr zhvillimin e web aplikacioneve q jan vn ndonjher s bashku. ASP.NET sht nj lulzim i plot me nj platform gjithprfshirse pr zhvillimin e aplikacioneve. ASP.NET ofron web forma, e cila e thjeshtson shum krijimin e ndrfaqes s prdoruesit. Drag and drop n Visual Studio .NET e bjn shum m t leht pr vendosjen e formave.

Pjesa kryesore

Krijimi i ASP.NET web faqes s par

Si prmendm edhe m hert aplikacionin do ta krijojm duke prdorur Visual Studio 2012 dhe ASP.NET 4.5, dhe hap pas hapi do t tregojm se si t krijojm aplikacionin ton duke filluar nga faqja kryesore e Visual Studios Fig 1.1.

Fig 1.1 Faqja e par e Visual StudiosPr t krijuar nj web site t ri do t klikojm mbi File New dhe Web Site dhe m pas do t paraqitet figura 1.2 me an t s cils ne mund t zgjedhim gjuhn programore q do t prdorim dhe krijimin e nje web site-i t zbrazt, e zgjedhim kt pasi q ne do t fillojm ti krijojm faqet dhe stilet sipas mnyrs ton. Fig 1.2 Zgjedhja e web site-evePasi e krijojm web site in e ri n ann e djatht t aplikacionit kemi Solution Explorer n t ciln do t vendosen t gjitha faqet, stilet, kontrollet q do t krijojm. Mbi emrin e aplikacionit klikojm me sustn e djatht Add Add New Item dhe zgjedhim se far dshirojm t shtojm, nj web form, stil, web user control etj.N fillim do t shtojm elementet m themelore n Default.aspx faqen q do t caktojm hapsirat ku do t vendosen header, menu, hapsira kryesore, sidebar dhe nj footer dhe m pastaj me nj stil m t thjesht do t caktojm zonat ku do t vendoset header, menu, hapsira kryesore, sidebar, dhe footer pr tu dukur m art. 1. E hapim Default.aspx n Markup View2. Shkruajm kodin brenda elementit , kodi prfundon kshtu:

Header Goes HereMenu Goes HereHi there visitor and welcome to Liberty shopSidebar Goes HereFooter Goes Here3. Shtojm stilin n stili.css duke e krijuar n mnyrn si e prmendm m par.

header { background-color: #C0C0C0; width: 844px; height: 86px; } * { font-family: Arial; }h1 { font-size: 20px; }#PageWrapper { width: 844px; margin: auto; }nav { width: 844px; }section#MainContent { width: 664px; float: left;}aside { background-color: Gray; width: 180px; float: left; }footer { background-color: #C0C0C0; width: 844px; clear: both; }Q ky stil t aplikohet ne duhet q ta shtojm at n faqe dhe kjo arrihet duke e vendosur stili.css brenda tagut < head > . 4. Prderisa faqja prdor HTML5 do t na duhet nj browser q do ta mbshtes versionin e fundit t HTML me qllim q faqja t duket si duhet. Pr shfletuesit t vjetr si sht Internet Explorer 8 dhe m t vjetr ne do t prdorim nj librari t JavaScript q quhet Modernizer. Ky modernizer mbshtet disa nga HTML elementet si jan nav, section, aside.Shtimi i modernizerit n faqen ton sht shum e thjesht dhe kjo bhet duke e prdorur Package Manager Console e cila sht n Visual Sudio. Pr t shtuar kt librari, ndjekim kto hapa:1) Zgjedhim Tools Library Package Manager Package Manager Console.2) Shkruajm komandn n vazhdim dhe shtypim Enter.

Install-Package Modernizr3) Pas ksaj n faqen ton do t shtohet nj folder me emrin Scripts q prmban filein modernizr- 2.6.2.js. Pr ta shtuar kt librari n faqen ton, e hapim Default.aspx dhe mbrena tagut < head > e vendosim file-in

4) N fund, i ruajm t gjitha ndryshimet q kemi br dhe e ekzekutojm Default.aspx.

Krijimi i master page-it

Me shumicn e website-ve, vetm disa pjes t faqes ndryshojn, kur shkojm nga njra faqe n tjetrn. Pjest t cilat nuk ndryshojn zakonisht prmbajn regjione t prbashkta si header, menu, aside, footer. Pr t krijuar web faqe me paraqitje (layout) t prbashkt, do t na duhet nj mnyr pr ti definuar kto regjione relativisht statike n nj file t vetm. Verzionet m t vjetra t ASP.NET 2.0 nuk e kishn kt mundsi n kto verzione n seciln faqe i krijonjn kto forma, por pr fat t mir kjo nuk sht m nj penges pr shkak t master pages. Prfitimi m i mir i ktyre master pages sht se ato na mundsojn q t krijojm pamjen pr t gjitha faqet me nj file.

1. E hapim projektin n Visual Studio, nse nuk sht e hapur.2. Klikojm mbi emrin e projektit me sustn e djatht dhe zgjedhim Add Add New Item dhe selektojm Master Page. Duhet q t sigurohemi q master page prdor Code Behind dhe gjuhn q ne e dshirojm. Ia vendosim emrin master page-it si dshirojm dhe m n fund klikojm Add.3. Mbrenda tagut < form > vendosim kt kod:

  • Home
  • Woman
    • Shoes
    • Clothing
    • Accessories
    • Beauty
  • Man
    • Shoes
    • Clothing
  • Children
  • Gift
  • Combination
  • Scarves

Made by Rilinda Abazi Contact About us Jobs 4. M pastaj, klikojm mbi Design dhe e zhvendosim stilin stili.css nga Solution Explorer mbi master page dhe master page bashk me kodin dhe stilin do t duket si n figurn 1.4, por jo me fotografit sepse kto do ti tregojm si do ti vendosim m von.

Fig 1.45. E vendosim edhe file-in modernizer-2.6.2.js n tagun < head > t master page-it

N vazhdim do t shohim se si kt master page ta prdorim si template pr faqet e tjera.

Krijimi i Content Page

Nj master page sht e pa prdorshme pa content page. N prgjithsi, ne do t kemi disa master page, kurse content page do t kemi m shum. Pr ta vendosur nj content page n master page do t bjm check opcionin Select Master Page e cila ndodhet n fund n ann e djatht t faqes pr t krijuar nj faqe t re. Content pages mund t prmbajn vetm kontrollin contetnt e cila lidhet me kontrollin ContetntPlaceHolder n master page. Kto kontrolle mund t prmbajn HTML dhe server control.Shtimi i nj content page1. Klikojm mbi emrin e web site-it me sustn e djatht n Solution Explorer dhe zgjedhim Add Add New Item, e zgjedhim gjuhn programore q dshirojm n kt rast C#, klikojm Web Form e emrojm faqen Default.aspx dhe m pastaj n fund t faqes i selektojm t dy Place Code in Separate File dhe Select Master Page, si n figurn 1.5.

Fig 1.5 Zgjedhja e formave q dshirojm2. N dritaren Select a Master Page, klikojm demos floderin dhe MasterPage.master.

N vend q t fitojm nj faqe t plot me HTML si n faqet standarde ASPX, ne tani do t kemi vetm dy placeholders.

3. Brenda Content2 vendosim kt kod:

Validimi i t dhnave t prdoruesit ( Validating user inputs )

Validating user inputs in web forms

Njerzit t cilt merren me validimin e t dhnave t prdoruesve shpesh prdorin thnien: Asnjher mos u beso t dhnave t prdoruesve. Megjithat kjo n fillim mund t duket si paranoj, por sht shum e rndsishme n nj sistem t hapur. Edhe n qoft se mendojm se i dim se kush jan kto prdorues, edhe n qoft se i besojm kto plotsisht, ato shpesh her nuk jan t vetmit prdorues t cilt mund ti qasen sistemit ton. Sa m shum q faqja jon t jet n internet sht nj objektiv pr prdoruesit me qllim t keq dhe hakerat t cilt do t mundohen q ta gjejn nj mnyr pr t hyr n sistemin ton. Pr t na ndihmuar q ta shmangim kt problem sa m shpejt t jet e mundur, ASP.NET na drejton n nj gam t kontrollave t validimit t cilat na ndihmojn t verifikojm t dhnat prpara se ato t prdoren n aplikacion.The ASP.NET validation control

ASP.NET 4.5 vjen me 6 kontrolla t dobishm pr t performuar validimin n web site-in ton, pes prej tyre prdoren pr t performuar validimin aktual, kurse kontrolli i fundit ValidationSummary prdoret pr t siguruar nj prapavij pr prdoruesin pr ndonj gabim q sht br n faqe. Figura 2.0 tregon kontrollat e mundshm n kategorin e validimit.

Fig 2.0 Kontrollat e validimitRequiredFieldValidator sht m i thjeshti nga validimi i kontrolleve. Ky bn saktsisht at ka kuptohet edhe nga vet emri: ai siguron q nj prdorues ka futur nj vler n web kontrol.CompareValidator nj nga validimi i kontrolleve m t prdorshm sht comapre validator i cili krahason t dhnat e futura n nj kontroll me t dhnat n kontrollin tjetr.RangeValidator kontrollon nse vlera nga fusha e dhn sht ndrmjet minimumit dhe maksimumit. Pr shembull, n faqen ton mund t lejojm t regjistrohen prdoruesit q jan minimum m t vegjl se 1/1/1970 dhe maksimumi 1/1/2000.RegularExpressionValidator na lejon q t specifikojm nj shprehje (expression) t rregullt e cila prshkruan t gjitha vlerat e mundshme pr fushn. Shprehjet e rregullta jan mjete shum t fuqishme pr manipulimin e stringjeve, dhe mbshteten nga disa gjuh programore. Pr shembull, ^\S+@\S+\.\S+$ - kjo nnkupton q do t ket stringje ose karaktere si psh mund t jet nj email adres [email protected] na lejon q t shkruajm custom validation funksione pr klientin n JavaScript dhe serverin me C#.N kt ushtrim do t krijojm nj user control q quhet ContactForm.ascx.User controls jan t fuqishm se nprmjet ktyre n faqe mund t vendosim kontrolle, dhe kod q do t na duhet n mnyr t prsritur n faqen ton. Kto duken pak si server controls n at se ato prmbajn programim logjik, dhe prezentim q ne do ta prdorim n faqet tona. Megjithse master pages na mundsonjn t krijojm prmbajtje (content) q paraqiteshte n t gjitha faqet e site-it ton, sht e kuptueshme se do t na duhet t kemi prmbajtje t cilat do t shfaqen n disa faqe. Pr shembull, ne ndoshta do t duam t paraqesim nj banner n disa faqe m t njohura. Pa user controls, ne do t duheshte t shtonjm kod pr banner n seciln faqe. Kur do t duam q ta prditsojm banner me nj foto ose link, ne do t duheshte q t bjm ndryshime n t gjitha faqet t cilat e prdorin. User control do t na ndihmonte q ndryshimet ti bjm vetm n user control-in dhe faqet e tjera do ti ndryshonjm automatikisht.1. E hapim projektin ton dhe shtojm nj user control ContactForm.ascx.2. Shkojm n Design View dhe shtojm nj tabel duke zgjedhur Table Insert Table. Krijojm nj tabel me 8 rreshta dhe 3 kolona. 3. I bashkojm 3 kollonat e rreshtit t par, pr ta br kt shkojm Table Modify dhe Merge Cells.4. N qelin e par t rreshtit t dyt, shkruajm fjaln Name. N qelin e dyt t t njejtit rresht zhvendosim nj TextBox dhe ID e tij e ndryshojm n Name. N qelin e fundit t t njejtit rresht vendosim nj RequiretFieldValidator. N qelin e dyt t rreshtit t fundit vendosim nj Button, ID e ndryshojm n SendButton.5. Klikojm RequiredFieldValidator dhe n Design View shkruajm vetit e saj:

6. N kolonn e dyt zhvendosim pes textbox ndrmjet texbox-it name dhe sendbutton, kontrollave t ri ua vendosim ID si vijon:

EmailAddress ConfirmEmailAddress PhoneHome PhoneBusiness Comments7. E vendosim vetin TextMode t Comments n MultiLine. 8. E vendosim vetin TextMode t email-ave n e-mail, shfletuesit t cilt e mbshtesin kt do t verifikojn vlern e e-mail adress.9. Kontrollet e tjer do ti shtoj si n figurn m posht:

Fig 2.110. N secilin kontroll q e shtuam, e hapim Properties Grid, vetin e Text e shnojm ( * ), vetin Display n Dynamic dhe CssClass n ErrorMessage.11. Vetit e tjera pr kontrollet do ti vendosim si n tabeln m posht:

12. Akoma n Design View, klikojm mbi RegularExpressionValidator, hapim Properties Grid, klikojm mbi butonin dhe hapet dritarja pr t zgjedh regular expression.13. Zgjedhim internet e-mail address. 14. N file-in stili.css shkruajm kt kod:

.ErrorMessage{color: Red;}15. Krijojm Contact.aspx dhe nga Solution Explorer zhvendosim user control-in ContactForm.ascx mbrenda tagut ContentPlaceHolder1. Kodi i cili do t paraqitet sht ky:

16. E hapim Web.config dhe e modifikojm kodin si n vazhdim:

17. I ruajm t gjitha ndryshimet q kemi br dhe e hapim Contact.aspx n shfletues dhe forma do t duket si ne figurn 2.2

Fig 2.2 Forma pr Contact Us

Client and server side validation method

N kt ushtrim do t shohim se si ta prdorim CustomValidator n faqen ton pr tu siguruar se m s paku njri nga dy numrat sht futur.1. N ContactForm.ascx shtojm dhe nj rresht n fund t tabels dhe n kt rresht vendosim nj ValidationSummary.2. N qelin e zbrazt t Home Phone number vendosim nj CustomValidator dhe i shkruajm kto veti:

3. Klikojm dy her mbi CustomValidator dhe shkruajm kodin:

protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args) { if (!string.IsNullOrEmpty(TextBox4.Text) || !string.IsNullOrEmpty(TextBox5.Text)) { args.IsValid = true; } else { args.IsValid = false; } }4. N Markup View shkruajm kodin e JavaScript:

function validatePhoneNumbers(source, args) { var phoneHome = document.getElementById(''); var phoneBussiness = document.getElementById(''); if (TextBox4.value != '' || TextBox5.value != '') { args.IsValid = true; } else { args.IsValid = false; } } Si funksionon kjo ?Pasi e shtuam CustomValidator, ne vendosm dy event handlers nj pr klient side dhe nj pr server side:*Fuksioni i JavaScript validatePhoneNumbers q e vendosm n ClientValidationFuncti prmban dy referenca t text boksave pr numrat e telefonit:var phoneHome = document.getElementById('');var phoneBusiness = document.getElementById('');Kodi ndrmjet ekzekutohet n server dhe ia kthen ClientID klientit.

Hyrje n databaz

ka sht databaza ?

Nj databaz sht nj prmbledhje e t dhnave e rregulluar n at mnyr q mund ti qasemi, t menaxhohet dhe t prditsohet m leht. Lloji m i popullarizuar i databass sht relational database. sht nj lloj database e cila prdoret shpesh n website, sidooft relational database nuk sht e vetme, ekzistojn edhe lloje t tjera, duke prfshir flat-file, NoSQL, object-relational dhe object-oriented databasat, por kto nuk prdoren edhe aq shum n aplikacionet e internetit. Nj relational database ka kuptimin e tabelave, ku t dhnat jan t vendosura n rreshta dhe kolona. Termi relational i referohet mnyrs se si tabela t ndryshme mund t lidhen me njra tjetrn. N vend q ti dyfishojm t dhnat e njejta, ne i vendosim t dhnat t cilat prsriten dhe m pastaj krijojm nj lidhje mes dy tabelave.

Diagramet dhe lidhja e tabelave

Lidhjet prshkruajn se si t dhnat n njrn tabel jan t lidhura me t dhnat n tabeln tjetr. Lidhjet ekzistojn pr nj qllim pr lidhjen e njrs tabel me nj ose m shum tabela t tjera duke prdorur primary keys dhe foreign keys. Ekzistojn tre lloje t lidhjeve q mund t ndodhin ndrmjet tabelave n nj databaz dhe kto jan: one-to-one, one-to-many dhe many-to-many.One-to-one - me kt lidhje nnkuptojm se pr secilen t dhn n nj tabel vetm nj tjetr e dhn e lidhur mund t ekzistoj n tabeln tjetr.One-to-many kjo lidhje prdoret m shum se lidhjet e tjera, me kt lidhje secila e dhn n nj tabel mund t lidhet me m shum t dhna n tabeln e dyt. Prshembull, nj departament mund t lidhet me m shum puntor.Many-to-many edhe kjo lidhje ndodh ndrmjet tabelave, t dhnat e njrs tabel lidhen me m shum t dhna nga tabela tjetr. Pr shembull nj puntor tu takoj m shum departamenteve dhe nj departament mund tu takoj m shum puntorve.

ka jan primary keys dhe identities

Pr t identifikuar nj rresht n nj tabel ne n at rresht vendosim nj primary key. Nj primary key prbhet nga nj ose m shum kolona dhe q prmban nj vler q sht unike nga t tjerat. SQL Server gjithashtu mbshtet identity kolonat. Nj identity kolon sht nj kolon me numra vlerat e t cils gjenerohen automatikisht kur nj rresht shtohet.Krijimi i tabels Department

Pr krijimin e tabelave do t prdorim SQL Servet Management Studio. Pderisa kjo sht hera e par q ne lidhemi me databazn, s pari ne duhet q t konfigurojm nj lidhje, klikojm me t djathtn mbi Data Connection e cila ndodhet n ann e djatht t programit dhe selektojm Add Conection. Klikojm mbi Tables dhe selektojm Add New Table. Tabela do t prmbaj kto t dhna:Emri Tipi Veti t tjeraDepartmentID int primary key dhe identity columnName nvarchar(50) mos lejo NULLDescription nvarchar(1000) lejo NULL

Stored Procedures

Stored procedures jan objekte t databazs q gruponj nj ose m shum T-SQL deklarata. Stored procedures mund t marrin parametra dhe t kthejn vler. Stored procedures prdoren pr t prmbledhur SQL komandat q performojn nj veprim t vetm dhe logjik. Pr shembull, le t themi se ne dshirojm q t shtojm n website-in ton funksionalitetin q lejon fshirjen e departamenteve.Forma bazike e stored procedurs:CREATE PROCEDURE ProcedureName(@Parameter1 DataType,@Parameter2 DataType,)ASSQL Commands

Tani ne do t krijojm store procedurn GetDepartments e cila do t kthej informacionet e departamenteve nga tabela Department. SQL kodi q kthen t dhnat e nevojshme dhe q ne do ti ruajm n databaz sht: SELECT DepartmentID, Name, Description FROM Department. Kurse stored procedurn do ta krijojm duke klikuar me sustn e djatht mbi Stored Procedure dhe Add New Stored Procedure dhe e shnojm kodin si n vijim:CREATE PROCEDURE GetDepartments ASSELECT DepartmentID, Name, DescriptionFROM DepartmentN vazhdim do t shtojm disa klasa t cilat do t na ndihmojn pr qasjen n databaz e cila do ta lexoj nga web.config, pr krijimin e linqeve q do t lidh faqet ndrmjet veti, implementimin e error-handling. N folderin App_Code do t krijojm klasn LibertyShopConfiguration.cs me kodin:using System.Configuration;

/// /// Repository for BalloonShop configuration settings/// public static class BalloonShopConfiguration{ // Caches the connection string private static string dbConnectionString; // Caches the data provider name private static string dbProviderName;

static BalloonShopConfiguration() { dbConnectionString = ConfigurationManager.ConnectionStrings["OnlineShopping1ConnectionString"].ConnectionString; dbProviderName = ConfigurationManager.ConnectionStrings["OnlineShopping1ConnectionString"].ProviderName; }

// Returns the connection string for the BalloonShop database public static string DbConnectionString { get { return dbConnectionString; } }

// Returns the data provider name public static string DbProviderName { get { return dbProviderName; } }

// Returns the address of the mail server public static string MailServer { get { return ConfigurationManager.AppSettings["MailServer"]; } }

// Returns the email username public static string MailUsername { get { return ConfigurationManager.AppSettings["MailUsername"]; } }

// Returns the email password public static string MailPassword { get { return ConfigurationManager.AppSettings["MailPassword"]; } }

// Returns the email password public static string MailFrom { get { return ConfigurationManager.AppSettings["MailFrom"]; } }

// Send error log emails? public static bool EnableErrorLogEmail { get { return bool.Parse(ConfigurationManager.AppSettings ["EnableErrorLogEmail"]); } }

// Returns the email address where to send error reports public static string ErrorLogEmail { get { return ConfigurationManager.AppSettings["ErrorLogEmail"]; } }}

GenericDataAccess.csusing System;using System.Data;using System.Data.Common;

/// /// Class contains generic data access functionality to be accessed from /// the business tier/// public static class GenericDataAccess{ // static constructor static GenericDataAccess() { // // TODO: Add constructor logic here // }

// executes a command and returns the results as a DataTable object public static DataTable ExecuteSelectCommand(DbCommand command) { // The DataTable to be returned DataTable table; // Execute the command making sure the connection gets closed in the end try { // Open the data connection command.Connection.Open(); // Execute the command and save the results in a DataTable DbDataReader reader = command.ExecuteReader(); table = new DataTable(); table.Load(reader);

// Close the reader reader.Close(); } catch (Exception ex) { Utilities.LogError(ex); throw; } finally { // Close the connection command.Connection.Close(); } return table; }

// creates and prepares a new DbCommand object on a new connection public static DbCommand CreateCommand() { // Obtain the database provider name string dataProviderName = BalloonShopConfiguration.DbProviderName; // Obtain the database connection string string connectionString = BalloonShopConfiguration.DbConnectionString; // Create a new data provider factory DbProviderFactory factory = DbProviderFactories. GetFactory(dataProviderName); // Obtain a database specific connection object DbConnection conn = factory.CreateConnection(); // Set the connection string conn.ConnectionString = connectionString; // Create a database specific command object DbCommand comm = conn.CreateCommand(); // Set the command type to stored procedure comm.CommandType = CommandType.StoredProcedure; // Return the initialized command object return comm; }}CatalogAccess.csusing System;using System.Data;using System.Data.Common;

/// /// Product catalog business tier component/// public static class CatalogAccess{ static CatalogAccess() { // // TODO: Add constructor logic here // }

// Retrieve the list of departments public static DataTable GetDepartments() { // get a configured DbCommand object DbCommand comm = GenericDataAccess.CreateCommand(); // set the stored procedure name comm.CommandText = "GetDepartments"; // execute the stored procedure and return the results return GenericDataAccess.ExecuteSelectCommand(comm); }}Si e cekm edhe m lart n fillim ne shtuam disa konfigurime n web.config, web.config sht nj XML file i jashtm i menagjuar nga ASP.NET, ky file kompleks dhe i fuqishm mund t prfshij shum opcione lidhur me sigurin e aplikacionit, performancn dhe shum t tjera. File LibertyShopConfiguration.cs sht nj prmbledhje e thjesht e vetive statike q kthejn data nga web.config. Krijimi i ksaj klase n vend t leximit nga web.config do t na e bj krijimin e aplikacionit edhe m t leht. N vazhdim, ne krijuam GenericDataAccess.cs klasn qllimi i t cils sht q t ruaj nj seri t operacioneve t prbashkta pr qasje n databaz. CreateCommand, e cila krijon nj objekt DbCommand, vendos disa veti standarde, dhe kthen objektin e konfiguruar. ExecuteSelectCommand, kjo komand kthen rezultatin n DataTable n vend q n DataReader. Prdorimi i DataTable na siguron q lidhja me databazn mbahet e hapur sa m shkurt q t jet e mundur.Kemi zgjedhur pr t prdorur antar statik kryesisht pr t prmirsuar performancn e aplikacionit, sepse antart statik dhe klasat statike inicalizohen vetm nj her.

Qllimi i ksaj klase sht q t gjeneroj linqe pr ne. Implementimi i ksaj klase ka pr qllim q t gjith linqet n aplikacionin ton t ken form t njejt.

Link.csusing System;using System.Web;

/// /// Link factory class/// public class Link{ // Builds an absolute URL private static string BuildAbsolute(string relativeUri) { // get current uri Uri uri = HttpContext.Current.Request.Url; // build absolute path string app = HttpContext.Current.Request.ApplicationPath; if (!app.EndsWith("/")) app += "/"; relativeUri = relativeUri.TrimStart('/'); // return the absolute path return HttpUtility.UrlPathEncode( String.Format("http://{0}:{1}{2}{3}", uri.Host, uri.Port, app, relativeUri)); }

// Generate a department URL public static string ToDepartment(string departmentId, string page) { if (page == "1") return BuildAbsolute(String.Format("Catalog.aspx?DepartmentID={0}", departmentId)); else return BuildAbsolute(String.Format("Catalog.aspx?DepartmentID={0}&Page={1}", departmentId, page)); }

// Generate a department URL for the first page public static string ToDepartment(string departmentId) { return ToDepartment(departmentId, "1"); }}Klasa Link prmban dy publik statik metoda q gjenerojn linket e departamentit. Metoda e par gjeneron linqe pr nnfaqet e departamentit. Metoda e dyt gjeneron nj URL pr departamentin pr faqen e par. N vazhdim do t krijojm nj folder me emrin UserControls q do t prmbaj user control-at q do ti krijojm, user controli i par q do t krijojm sht DepartmentList.ascx dhe n kt user control shtojm nj DataList prej Toolbox-it, kjo DataList do t prmbaj kto veti: (ID) listWidth 200pxCssClass DepartmentsListHeaderStyle-CssClass DepartmentsListHead

E hapim DepartamentList.ascx n Design-View, klikojm me t djathtn n DataList, zgjedhim Edit Template Header and Footer Template, shkruajm Choose a Department n header template dhe n Edit Template Item Templates vendosim nj hyperlink, e modifikojm hyperlink-un si vijon:

E hapim code-behind dhe n Page_Load shkruajm kodin si m posht m pastaj n master page zhvendosim DepartmentList.ascx nga Solution Explorer:// CatalogAccess.GetDepartments returns a DataTable object containing// department data, which is read in the ItemTemplate of the DataListlist.DataSource = CatalogAccess.GetDepartments();// Needed to bind the data bound controls to the data sourcelist.DataBind();M e rndsishme n kt user control sht DataList kontrolli, i cili gjeneron listn e departamenteve. Hapi m i rndsishm pr konfigurimin e ktij kontrolli sht q t vendosim vetin ItemTemplate. Kur DataList t lidhet me data source, ItemTemplate gjeneron nj data list t re pr secilin rresht nga data source Kjo pjes e kodit prdor Link.ToDepartment pr t gjeneruar nj link t forms http://webserver/Catalog.aspx?DepartmentID=XXX . Kto detaje nxirren duke prdorur Eval funksionin.

Shtimi i Categories dhe Products n databaz

N vazhdim do t krijojm kto tabela: Category, Product, ProductCategory. Procesi i krijimit t tabels Category sht pothuajse i njejti me tabeln Department dhe lidhja ndrmjet dy tabelave do t jet One-to-Many. Tabela Category do t ket kto veti: Emri Tipi Vetit e tjeraCategoryID Int Primary key dhe indentity columnDepartmentID Int Mos lejo NULLName nvarchar(50) Mos lejo NULLDescription nvarchar(1000) Lejo NULLN vazhdim do t krijojm tabeln me vetit q i prmendm dhe do ta lidhim me tabeln Department. Prderisa tabela Category sht e hapur klikojm me sustn e djatht t miut dhe selektojm Relationships, dhe t dhnat e tjera i plotsojm si n figurn m posht.

Fig 3.0 Krijimi i foreign keyTabela Products prmban kto veti: Emri Tipi Veti tjeraProductID int Primary key dhe identity columnName nvarchar(50) Mos lejo NULLDescription nvarchar(max) Mos lejo NULLPrice money Mos lejo NULLThumbnail nvarchar(50) Defalut value GenericThumb.pngImage nvarchar(50) Default value GenericImage.pngPromoFront bit Mos lejo NULL dhe default value 0PromoDept bit Mos lejo NULL dhe default value 0Tani do t krijojm nj tabel me lidhje many-to-many me emrin ProductCategory e cila do t prmbaj kto veti:Emri Tipi Veti tjeraProductID int Primary key dhe identity columnCategoryID int Primary key dhe identity columnN kt ushtrim, ne krijuam tabeln Product dhe implementuam lidhjen Many-to-Many me tabeln Category. Many-to-Many lidhja sht krijuar duke shtuar nj tabel t tret q sht ProductCategory, dhe e emruar si junction table.Kjo tabel prmban ProductID dhe CategoryID. Kshtu q, nse shohim nj rekord (1,4) n ProductCategory ne e dim q produkti me ProductID 1 i prket kategoris me CategoryID 4.Krijojm nj diagram dhe n at diagram vendosim t gjitha tabelat q i kemi krijuar dhe i lidhim tabelat Category dhe Product me tabelen ProductCategory dhe kshtu formohet lidhja many-to-many. Fig 3.1 Pamja e tabelave dhe lidhjeve duke prdorur databaz diagramin

N tabeln Category, vemas elsit primar dhe CategoryID, Name, Description, ne shtuam edhe kolonn DepartmentID. Kjo kolon e ruan ID e departamentit t kategoris q i prket. N lidhjen One-to-Many ne lidhim dy kolona nga dy tabela t ndryshme, njra nga kto kolona sht elsi primar dhe kjo definon nj (One) pjes t lidhjes. N kt rast, DepartmentID sht elsi primar i tabels Department, kshtu q Department sht ajo q lidhet me m shum (many) kategori.

N vazhdim do t krijojm edhe disa stored procedura tjera t cilat do t na duhen pr vazhdimin e aplikacionit edhe m tutje. Stored procedura e par sht CatalogGetDepartmentsDetails kjo procedur do t na duhet kur prdoruesi do t selektoj nj departament n produkt katalogun. Kur kjo t ndodh, databaza duhet t krkohet prsri pr t gjetur emrin dhe prshkrimin e departamenteve n veqanti. Stored procedura pranon ID nga departamenti i selektuar si parametr dhe kthen emrin dhe prshkrimin. Kodi pr kt procedur sht si vijon: CREATE PROCEDURE CatalogGetDepartmentDetails(@DepartmentID INT)ASSELECT Name, DescriptionFROM DepartmentWHERE DepartmentID = @DepartmentIDCatalogGetCategoryDetailsKjo procedur do t thirret kur vizitort do t selektojn nj kategori dhe do t duan q t gjejn m shum informacione pr t, si jan emri dhe prshkrimi.CREATE PROCEDURE CatalogGetCategoryDetails(@CategoryID INT)ASSELECT DepartmentID, Name, DescriptionFROM CategoryWHERE CategoryID = @CategoryIDCatalogGetProductDetailsKjo procedur thirret kur duam q t shfaqim detajet e produkteve. Informacioni q do t duhet t shfaqet sht emri, prshkrimi, mimi dhe fotoja e dyt e produktit. CREATE PROCEDURE CatalogGetProductDetails(@ProductID INT)ASSELECT Name, Description, Price, Thumbnail, Image, PromoFront, PromoDeptFROM ProductWHERE ProductID = @ProductIDCatalogGetCategoriesInDepartmentKur vizitori t selektoj ndonj nga departamentet, prve se t na tregohen detajet e departamentit ne gjithashtu do t duam q t na shfaqen edhe kategorin q jan n at departament dhe kjo do t arrihet me an t procedurs CatalogGetCategoriesInDepartment, kjo procedur do t kthej ID, emrin dhe prshkrimin pr kategorit q jan pjes e departamentit.CREATE PROCEDURE CatalogGetCategoriesInDepartment(@DepartmentID INT)ASSELECT CategoryID, Name, DescriptionFROM CategoryWHERE DepartmentID = @DepartmentIDCatalogGetProductsInCategoryKur vizitort selektojn nj kategori nga departamenti, ne do t duam q t listojm t gjitha produktet q bjn pjes n at kategori.CREATE PROCEDURE CatalogGetProductsInCategory(@CategoryID INT,@DescriptionLength INT,@PageNumber INT,@ProductsPerPage INT,@HowManyProducts INT OUTPUT)AS-- declare a new TABLE variableDECLARE @Products TABLE(RowNumber INT,ProductID INT,Name NVARCHAR(50),Description NVARCHAR(MAX),Price MONEY,Thumbnail NVARCHAR(50),Image NVARCHAR(50),PromoFront bit,PromoDept bit)-- populate the table variable with the complete list of productsINSERT INTO @ProductsSELECT ROW_NUMBER() OVER (ORDER BY Product.ProductID),Product.ProductID, Name,CASE WHEN LEN(Description) (@PageNumber - 1) * @ProductsPerPageAND RowNumber >

N page load shkruajm kt kod, mbas ksaj user kontrollin q e krijuam do ta vendosim n master page-in dhe faqja do t duket si n figurn 3.2// Obtain the ID of the selected departmentstring departmentId = Request.QueryString["DepartmentID"];// Continue only if DepartmentID exists in the query stringif (departmentId != null){// Catalog.GetCategoriesInDepartment returns a DataTable// object containing category data, which is displayed by the DataListlist.DataSource = CatalogAccess.GetCategoriesInDepartment(departmentId);// Needed to bind the data bound controls to the data sourcelist.DataBind();} Fig 3.2 Pamja e departamanteve dhe kategoriveShfaqja e lists me produkte

Kjo faqe do t na mundsoj shfaqjen e lists s produkteve duke prdorur web user kontrollin me emrin ProductList.ascx, ky kontroll sht shum i ngjajshm me CategoriesList dhe DeartmentList, prdor DataList pr t gjeneruar nj list me produkte. N fillim do t krijojm nj web user kontroll me emrin ProductsList.ascx, vendosim nj DataList kontroll nga toolbox neProductsList, e ndryshojm ID e DataList n list dhe shkruajm kodin si n vazhdim:

Price:

Modifikojm ProductList klasn n ProductList.ascx.cs me kodin:protected void Page_Load(object sender, EventArgs e) { PopulateControls(); } private void PopulateControls() { // Retrieve DepartmentID from the query string string departmentId = Request.QueryString["DepartmentID"]; // Retrieve CategoryID from the query string string categoryId = Request.QueryString["CategoryID"]; // Retrieve Page from the query string string page = Request.QueryString["Page"]; if (page == null) page = "1"; // Retrieve Search string from query string string searchString = Request.QueryString["Search"]; // How many pages of products? int howManyPages = 1; // pager links format string firstPageUrl = ""; string pagerFormat = "";

// If performing a product search if (searchString != null) { // Retrieve AllWords from query string string allWords = Request.QueryString["AllWords"]; // Perform search list.DataSource = CatalogAccess.Search(searchString, allWords, page, out howManyPages); list.DataBind(); // Display pager firstPageUrl = Link.ToSearch(searchString, allWords.ToUpper() == "TRUE", "1"); pagerFormat = Link.ToSearch(searchString, allWords.ToUpper() == "TRUE", "{0}"); }

// If browsing a category... else if (categoryId != null) { // Retrieve list of products in a category list.DataSource = CatalogAccess.GetProductsInCategory(categoryId, page, out howManyPages); list.DataBind(); // get first page url and pager format firstPageUrl = Link.ToCategory(departmentId, categoryId, "1"); pagerFormat = Link.ToCategory(departmentId, categoryId, "{0}"); } else if (departmentId != null) { // Retrieve list of products on department promotion list.DataSource = CatalogAccess.GetProductsOnDeptPromo (departmentId, page, out howManyPages); list.DataBind(); // get first page url and pager format firstPageUrl = Link.ToDepartment(departmentId, "1"); pagerFormat = Link.ToDepartment(departmentId, "{0}"); } else { // Retrieve list of products on catalog promotion list.DataSource = CatalogAccess.GetProductsOnFrontPromo(page, out howManyPages); list.DataBind(); // have the current page as integer int currentPage = Int32.Parse(page);

}

// Display pager controls topPager.Show(int.Parse(page), howManyPages, firstPageUrl, pagerFormat, false); bottomPager.Show(int.Parse(page), howManyPages, firstPageUrl, pagerFormat, true); }ProductList.ascx sht e njejt me CategoriesList dhe DepartmentList, prdor DataList pr ti shfaqur produktet. Por n kt faqe kemi shtuar edhe nj kontroll q sht paging. Paging shfaqet vetm ather kur kemi m shum produkte n faqe, i cili e kthen numrin total t nnfaqeve nprmjet howManyPages out parametrit. Numrimi i faqeve do t jet i dukshm vetm ather kur numri i nnfaqeve sht m i madh se 1.Previous dhe Next kan nj rol t thjesht pr rritjen dhe zvoglimin e vlers s Pages.PayPal shopping cart

Me siguri prshkrimi m i mir pr kt shrbim sht edhe ai q sht n faqen e paypal PayPal sht nj acount-based sistem i cili i lejon t gjith me nj email adres t sigurt t dorzojn dhe pranojn pagesa online duke prdorur kartat e kreditit ose llogarit bankare. N vend q t paguajn shitsin n mnyr t drejtprdrejt, vizitort paguajn duke prdorur kartat e kreditit ose llogari bankare. Pastaj shitsit e kompanis prdorin PayPal llogari pr ti marr kto para t drguara nga konsumatort. N ushtrimin n vazhdim do t krijojm nj PayPal llogari dhe m pastaj ta integrojm at n aplikacionin ton. N faqen ton shtojm nj buton me emrin Add To Cart. Funksionaliteti i butonit q do t shtojm n kt faqe sht i prmbushur nga nj link i sigurt i faqes s paypal. Si fillim do t bjm disa modifikime n web.config n elementin , kur t klikojm butonin Add To Cart nprmjet linkut q e vendosm n appsettings do t na drejtoj n PayPal shopping cart si n figurn m posht.

Fig 3.3 Shopping cart

...

N klasn LibertyShopConfiguration bjm kto modifikime:// The PayPal shopping cart URL public static string PaypalUrl { get { return ConfigurationManager.AppSettings["PaypalUrl"]; } }

// The PayPal e-mail account public static string PaypalEmail { get { return ConfigurationManager.AppSettings["PaypalEmail"]; } }

// Currency code (such as USD) public static string PaypalCurrency { get { return ConfigurationManager.AppSettings["PaypalCurrency"]; } }

// Return URL after a successful transaction public static string PaypalReturnUrl { get { return ConfigurationManager.AppSettings["PaypalReturnUrl"]; } }

// Return URL after a canceled transaction public static string PaypalCancelUrl { get { return ConfigurationManager.AppSettings["PaypalCancelUrl"]; } }

N vazhdim shtojm butonin PayPal Add to Cart n Product.aspx:

Add to Shopping Cart Brenda butonit shnojm kodin:protected void AddToCartButton_Click(object sender, EventArgs e) { // Retrieve ProductID from the query string string productId = Request.QueryString["ProductID"]; // Retrieves product details ProductDetails pd = CatalogAccess.GetProductDetails(productId);

// Retrieve the selected product options string options = ""; foreach (Control cnt in attrPlaceHolder.Controls) { if (cnt is Label) { Label attrLabel = (Label)cnt; options += attrLabel.Text; }

if (cnt is DropDownList) { DropDownList attrDropDown = (DropDownList)cnt; options += attrDropDown.Items[attrDropDown.SelectedIndex] + "; "; } }

// The Add to Cart link string productUrl = Link.ToProduct(pd.ProductID.ToString()); string destination = Link.ToPayPalAddItem(productUrl, pd.Name, pd.Price, options); Response.Redirect(destination); }Q tani, t gjith vizitort bhen klient potencial. Ato do t mund t klikojn n Checkout butonin, i cili u lejon q t blejn produkte. Pasi klienti do t bj pagesn n web site, nj email do ti drgohet email adress t regjistruar n PayPal dhe gjithashtu klientit.Administrimi i departamenteve dhe kategorive

N kt kapitull ne do t tregojm se si t shtojm dhe fshijm departamentet, modifikimi i informacioneve pr departamentet ekzistuese, t shohim listn e kategorive q i prkasin departamentit, shtimin dhe fshirjen e kategorive, prmirsimin e informacioneve pr kategorit ekzistuese. Hapi i par drejt krijimit t faqes pr administrim t web aplikacionit sht q t krijojm nj login pr administratort. Login sht mjeti m i prdorshm, ky prmban nj login dritare me emrin e prdoruesit dhe password-in. LoginView ka mundsi q t shfaq template t ndryshm, AnonymousTemplate shfaqet kur nuk ka asnj prdorues t loguar si psh You are not logged in. LoginName sht nj kontroll i thjesht i cili shfaq emrin e prdoruesit t loguar. LoginStatus gjeneron nj login link nse asnj prdorues nuk sht loguar dhe nj logout link n rast se ndonj prdorues sht i loguar.N vazhdim do t prdorim ASP.NET Configuration pr t shtuar prdorues. Kt do ta bjm duke klikuar mbi WebSite ASP.NET Configuration dhe do t paraqitet figura 3.3

Figura 3.3 ASP.NET ConfigurationKlikojm Enable Roles, klikojm Create or Manage roles, dhe krijojm nj rol me emrin Administrators. Dhe m pastaj krijojm prdorues me emrin admin dhe me password si e dshirojm. N vazhdim ne do t krijojm web user kontroll me emrin UserInfo, Login web form, Admin master page dhe AdminDepartments web form. N UserInfo do t shtojm nj kontroll LoginView i cili shfaq t dhna t ndryshme varsisht nga prdoruesi nse sht i loguar ose jo. Kodi pr UserInfo sht si m posht:

Welcome! You are not logged in.
LibertyShop
Catalog admin

Kt user kontroll e zhvendosim n master page-in MasterPage.master, hapi i ardhsm sht q t krijojm Login.aspx dhe m pastaj duhet q t bjm modifikime n file-in web.config, ndryshojm elementin < authentication> , ky ndyshim do ta regjistroj Login.aspx si default login faqe ku vizitort do t drejtohen n t kur t klikojn linkun.

N kt pik ne do t kemi nj mekanizm pr login dhe logout i cili do t funksionoj. Hapi i ardhshm dhe i fundit pr kt sht q t krijojm nj form t faqes pr administratort. Admin.master do t ket kt kod:

N vazhdim n web.config file-in do t krijojm faqet t cilat administratori i aplikacionit do t ket qasje.

N kt ushtrim, n fillim ne shtuam rolin Administrators dhe prdoruesin admin. Pas shtimit t prdoruesit admin ne krijuam UserInfo web user kontrollin, ktu prdorm login kontrolla t cilt i kemi shpjeguar m lart. M pastaj ne krijuam Login.aspx faqen kjo ishte shum e thjesht sepse prmbante vetm kontrollin Login. Dhe s fundi Admin.master sht krijuar q t shrbej si nj form e prgjithshme pr gjith administrimin e faqeve. Ne kt faqe e konfiguruam q tu qasen vetm prdoruesit t cilt kan rolin Administrators.Administrimi i departamenteve

Kjo pjes pr administrimin e departamenteve i lejon administratorit q t shtoj, fshij, ndryshoj departamente. Faqja q do t krijojm duket si n figrn 3.4

Fig 3.4 Faqja AdminDepartments.aspxSi e shohim nga figura m lart n kt faqe kemi prdorur labela, text boxa, nj buton dhe m e rndsishme ktu sht se deri m tani nuk kemi prdorur GridView n kt faqe prdorim edhe GridView. GridView sht m e fuqishme se DataList mbrenda GridView ne mund t kemi butona pr Edit, Select, Delete. Kodi pr kt faqe sh:

Liberty Admin
Departments

Create a new department:Name:

Description:

Kolonat n GridView i shtojm duke klikuar mbi SmartLink dhe zgjedhim Add new column, n kt form krijojm tre kolona me emrin Department Name, Department Description dhe View Categories. Q ky grid t funksionoj ne duhet q t shkruajm kodin si n vazhdim:protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { // Load the departments grid BindGrid(); } } private void BindGrid() { // Get a DataTable object containing the catalog departments grid.DataSource = CatalogAccess.GetDepartments(); // Bind the data bound controls to the data source grid.DataBind(); }Tani q gjithka duket n rregull, ne mund t implementojm funksionalitetin pr Edit, View categories dhe Delete butonat. Do t fillojm me row editing funksionalitetin. Selektojm grid dhe n vetit e gridit klikojm dy her mbi RowEditing dhe shkruajm kodin, m pastaj vazhdojm pr RowCanceling dhe n fund pr Delete butonin:protected void grid_RowEditing(object sender, GridViewEditEventArgs e) { // Set the row for which to enable edit mode grid.EditIndex = e.NewEditIndex; // Set status message statusLabel.Text = "Editing row # " + e.NewEditIndex.ToString(); // Reload the grid BindGrid(); } protected void grid_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { // Cancel edit mode grid.EditIndex = -1; // Set status message statusLabel.Text = "Editing canceled"; // Reload the grid BindGrid(); } protected void grid_RowUpdating(object sender, GridViewUpdateEventArgs e) { // Retrieve updated datastring id = grid.DataKeys[e.RowIndex].Value.ToString();string name = ((TextBox)grid.Rows[e.RowIndex].Cells[0].Controls[0]).Text;string description = ((TextBox)grid.Rows[e.RowIndex].Cells[1].Controls[0]).Text;// Execute the update commandbool success = CatalogAccess.UpdateDepartment(id, name, description);// Cancel edit modegrid.EditIndex = -1;// Display status messagestatusLabel.Text = success ? "Update successful" : "Update failed";// Reload the gridBindGrid(); } protected void grid_RowDeleting(object sender, GridViewDeleteEventArgs e) { // Get the ID of the record to be deleted string id = grid.DataKeys[e.RowIndex].Value.ToString(); // Execute the delete command bool success = CatalogAccess.DeleteDepartment(id); // Cancel edit mode grid.EditIndex = -1; // Display status message statusLabel.Text = success ? "Delete successful" : "Delete failed"; // Reload the grid BindGrid(); }Dhe n fund ka mbetur q t shkruajm kodin pr t krijuar nj departament t ri, kodin do ta shkruajm n butonin Create department:protected void createDepartment_Click(object sender, EventArgs e) { // Ekzekutimi i insert komandsbool success = CatalogAccess.AddDepartment(newName.Text, newDescription.Text);// Shfaqet mesazhistatusLabel.Text = success ? "Insert successful" : "Insert failed";// Reload the gridBindGrid(); }Pr shembull, pr ta br nj rresht edit, ne vetm duhet t vendosim vetin EditItemIndex. RowEditing eventi pranon GridViewEditEventArgs objekt i emruar e, i cili prmban indeksin e rreshtit n t ciln Edit butoni sht klikuar (e.NewItemIndex), ne mund ta marrim veprimin e njejt edhe pr CancelCommand, ku e ndalojm edit duke e vendosur GridViews EditIndex n -1. Grid_RowUpdating demonstron se si ta marrim ID e rreshtit i cili duhet t bhet update.Administrimi i kategorive

Administrimi i kategorive sht e njejt me administrimin e departamenteve. Krijojm formn pr AdminCategories.aspx dhe vendosim GridView, labelat. Textbox-at dhe butonat si i vendosm n AdminDepartments.aspx. N vazhdim do t shkruajm kodin pr GridView, pr butonin dhe pr eventet e tjera si i bm n AdminDepartments.aspx. Ndryshimi nga departamentet sht kur krijojm grid-in, n administrimin e departamenteve kishm nj kolon View Categories n administrimin e kategorive kemi View Products kolonn. Faqja do t duket si n figurn 3.4.

Figura 3.4 Faqja pr AdminCategories.aspx

Administrimi i produkteve

Tani administratorr e faqes kan mundsi t prmirsojn departamentet dhe kategorit n web site-in ton. N kt kapitull ne do t shtojm tiparet t cilat mungojn lidhur me menaxhimin e produkteve. Administratort e faqes do t ken mundsi q t: Shohin listn e produkteve n kategori specifike Prmirsimin e detajeve t produktit, si jan emri i produktit, prshkrimi, mimi. Fshirjen e nj produkti nga kategoriaN fillim t ksaj faqeje do t krijojm stored procedura t cilat e mbshtesin ndrfaqen e prdoruesit, kto procedura: CatalogGetAllProductsIncategory, CatalogCreateProduct, dhe CatalogUpdateProduct. M pastaj do t krijojm web formn me emrin AdminProducts.aspx nprmes s cils do t realizohen t gjitha kto funksione. Faqja pr AdminProducts do t duket si n figurn 3.5

Fig 3.5 Faqja pr AdminProducts.aspxKjo faqe krijohet njejt si n kapitujt e m parshm, prandaj nuk do t ndalemi n krijimin e ktyre butonav, labelave, dhe metodave sepse shumica e metodave jan t njejta me faqet e tjera q i kemi treguar, si edhe n faqet e tjera produktet mund t bhen update dhe t selektohen, administartori mund t ndryshoj foton e produktit duke prdorur faqen pr detajet e produktit, e cila shfaqet kur nj produkt sht i selektuar. AdminProductDetails na lejon q ti caktojm produktet e selektuar n kategori, zhvendosjen e produkteve n nj kategori tjetr, ngarkojm nj foto pr produktin, fshirjen e produktit nga kategoria ose fshirjen e produktit nga databaza.AdminProductDetails do t na mundsojn q: T shohim fotot e produkteve T shohim se produktet cils kategori i prkasin Fshirjen e produktit nga ajo kategori Fshirjen e produktit nga databaza Zhvendosjen e produktit aktual n nj kategori tjetrFaqja do t duket si n figurn m posht.

Fig 3.6 Faqja pr AdminProductDetailsKodi pr remove butonin:protected void removeButton_Click(object sender, EventArgs e) { // Check if a category was selected if (categoriesListRemove.SelectedIndex != -1) { // Get the category ID that was selected in the DropDownList string categoryId = categoriesListRemove.SelectedItem.Value; // Remove the product from the category bool success = CatalogAccess.RemoveProductFromCategory(currentProductId, categoryId); // Display status message statusLabel.Text = success ? "Product removed successfully" : "Product removal failed"; // Refresh the page PopulateControls(); } else statusLabel.Text = "You need to select a category"; }Kodi pr delete butonin:

protected void deleteButton_Click(object sender, EventArgs e) { // Delete the product from the catalog CatalogAccess.DeleteProduct(currentProductId); // Need to go back to the categories page now Response.Redirect("AdminDepartments.aspx"); }

Kodi pr assign butonin:protected void assignButton_Click(object sender, EventArgs e) { // Check if a category was selected if (categoriesListAssign.SelectedIndex != -1) { // Get the category ID that was selected in the DropDownList string categoryId = categoriesListAssign.SelectedItem.Value; // Assign the product to the category bool success = CatalogAccess.AssignProductToCategory(currentProductId, categoryId); // Display status message statusLabel.Text = success ? "Product assigned successfully" : "Product assignation failed"; // Refresh the page PopulateControls(); } else statusLabel.Text = "You need to select a category"; }Kodi pr move butonin:protected void moveButton_Click(object sender, EventArgs e) { // Check if a category was selected if (categoriesListMove.SelectedIndex != -1) { // Get the category ID that was selected in the DropDownList string newCategoryId = categoriesListMove.SelectedItem.Value; // Move the product to the category bool success = CatalogAccess.MoveProductToCategory(currentProductId, currentCategoryId, newCategoryId); // If the operation was successful, reload the page, // so the new category will reflect in the query string if (!success) statusLabel.Text = "Couldn't move the product to the specified category"; else Response.Redirect("AdminProductDetails.aspx" + "?DepartmentID=" + currentDepartmentId + "&CategoryID=" + newCategoryId + "&ProductID=" + currentProductId); } else statusLabel.Text = "You need to select a category"; }Kodi pr update butonin:protected void upload1Button_Click(object sender, EventArgs e) { // proceed with uploading only if the user selected a file if (image1FileUpload.HasFile) { try { string fileName = image1FileUpload.FileName; string location = Server.MapPath("/OnlineShopping/ProductImages/") + fileName; // save image to server image1FileUpload.SaveAs(location); // update database with new product details ProductDetails pd = CatalogAccess.GetProductDetails(currentProductId); CatalogAccess.UpdateProduct(currentProductId, pd.Name, pd.Description, pd.Price.ToString(), fileName, pd.Image, pd.PromoDept.ToString(), pd.PromoFront.ToString()); // reload the page Response.Redirect("AdminProductDetails.aspx" + "?DepartmentID=" + currentDepartmentId + "&CategoryID=" + currentCategoryId + "&ProductID=" + currentProductId); } catch { statusLabel.Text = "Uploading image 1 failed"; } }

Ndrtimi i nj lidhje t sigurt

Tani klientt mund q t regjistrohen n web faqen ton, t logohen dhe t ndryshojn t dhnat e tyre. Sidooft, sistemi aktual prfshin drgimin e informacioneve t ndjshme ndrmjet HTTP. Ky protokoll nuk sht i sigurt, dhe informacionet mund t vidhen. Pr ta shmangur kt ne duhet q aplikacionin ton ta bjm t punoj me SSL (Secure Socket Layer ) lidhjen duke prdorur HTTPS.

Sigurimi i SSL ertifikats nga VeriSign

Hapat kryesor pr sigurimin e ksaj ertifikate jan si vijojn: Sign up pr nj ertifikat n VeriSign web site-in Gjenerojm nj Certificate Signing Request(CSR) nprmjet IIS menaxhmentit n web serverin ton. Kojojm prmbajtjen e gjeneruar nga CSR n VeriSign sistemin Pastaj do t pranojm nj ertifikat nga VeriSign Pasi q ertifikata t jet instaluar, ne mund t kemi qasje n ndonjrn nga web faqet n web serverin duke prdorur SSL lidhje duke e zvendsuar http:// me https:// , nuk do t na duhet SSL lidhja n gjith faqet e aplikacionit sepse kjo do ta zvoglonte performancn e aplikacionit. Kjo lidhje vendoset n ato faqe ku shfrytzuesit logohen, kur bjn checkout, n faqet e administratorit.Koncepti mbrapa ksaj teknike t prezantuar sht se do faqe prdor Master Page. Ne duam q ti forcojm faqet t cilat prdorin Admin.master q gjithmon t prdor SSL, dhe ti forcojm faqet q prdorin MasterPage.master q disa her ta prdorin SSL. Admin.master krkon kodin si n vazhdim:protected override void OnInit(EventArgs e) { if (!Request.IsSecureConnection) { Response.Redirect(Request.Url.AbsoluteUri.ToLower().Replace("http://", "https://"), true); } base.OnInit(e); }Ktu ne zbulojm se kur nj lidhje SSL sht n prdorim dhe kur nuk prdoret me Request.IsSecureConnection.

Prfundimi

Teknologjia n pgjithsi dhe Interneti n veanti vazhdojn t ken ndikim do her e m shum n jett tona. Kshtu Interneti ka gjetur zbatim pothuajse n t gjitha sferat e jets si prshembull: informim, argtim, komunikim, marketing, blerje online etj. Agjensit informative bjn publikimin e informatave, institucionet e ndryshme publikojn aktivitetet e tyre, kompanit afariste bjn promovimin dhe reklamimin e veprimtarive por edhe shitjen e produkteve t tyre, njerzit tani mund q t blejn prej shtpis s tyre ka t dshirojn. T gjitha kto mundsi kan ardh n shprehje prmes teknologjive t ndryshme pr zhvillimin e web aplikacioneve. Nj ndr kto teknologji sht edhe ASP.NET i zhvilluar nga Microsoft pr krijimin e web aplikacioneve t lehta, t shpejta, t sigurta dhe iteraktive. Nprmjet ksaj teknologjie q Microsoft na e ka mundsuar ta prdorim ne mundemi t krijojm fardo lloj aplikacioni, nj nga aplikacionet q ne kemi krijuar n kt punim sht e-commerce aplikacion pr blerje online. Nprmjet mjeteve t shumta q na ofron ASP.NET ne mund q ti shohim kto produkte, t zgjedhim se far dshirojm t blejme, t zgjedhim madhsin e tyre nprmjet butonave, text box-ave. Problemi t cilat njerzit e kan sht mos siguria e ktyre aplikacioneve dhe frika pr t bler online por ky sht nj aplikacion aq i madh sa edhe prmban mjete shum t forta pr sigurin e ktyre aplikacioneve, nprmjet ktij aplikacioni ne mund q t instalojm provider t cilat na sigurojn aplikacionin ton, dhe her pas her Microsoft bn update t aplikacionit q do t thot rritet edhe m shum siguria e prdorimit t ketyre mjeteve.Dhe si prfundim mund t themi se kto mjete kan ndihmuar q t krijohen aplikacione t mdha dhe t sigurta me nj lehtsi t madhe pr zhvilluesit.

Literatura

Beginning ASP.NET E-Commerce in C# - From Novice to Professional, Apress (2009) Cristian Darie dhe Karli WatsonBeginning.ASP.NET.4.5.in.Csharp.2012 Imar SpanjarBuild Your Own ASP.NET 4 Web Site Using C & VB Cristian Darie, WYATT BARNETT& TIM POSEYApress.Pro.ASP.NET.4.in.CSharp.2010.4th.Edition.Jun.2010==3 - Matthew MacDonald, Adam Freeman, dhe Mario SzpusztaApress.Pro.ASP.NET.4.in.CSharp.2010.4th.Edition.Jun.2010==3 - Matthew MacDonald, Adam Freeman, dhe Mario SzpusztaBeginning_asp.net_4.5_databases_3rd_edition Sandeep Chanda dhe Damien FoggonBuild Your Own ASP.NET 2.0 Web Site Using C Sharp and VB.Net Cristian Darrie dhe Zak RuvalcabaStep.by.Step. (Microsoft.Press.Microsoft.ASP.NET.4Apr.2010)241 - George Shepherd

52