Implementarea Aplicatiilor de Afaceri Prin Asp.net și Xml
CUPRINS
INTRODUCERE 4
Capitolul 1. Afaceri electronice – concepte și caracteristici 6
1.1 Avantajele și dezavantajele unei afacerilor electronice 6
1.2 Modele de afaceri electronice 7
1.3 Modalități de plată online 10
1.4 Afacerile electronice în România 12
Capitolul 2. Tehonologia ASP.NET și limbajul XML 14
2.1. Platforma .NET și ASP.NET 14
2.2. Limbajul XML în contextul ASP.NET 16
Capitolul 3. Implementarea unei afaceri electronice de tip B2C prin ASP.NET și XML 17
3.1 Descrierea aplicației 17
3.2 Arhitectura aplicației 17
3.3 Proiectarea interfeței site-ului 19
3.4 Utilizatorii și conturile acestora 24
3.5 Administrarea articolelor 31
3.6 Chestionare 34
3.7 Newsletter 36
3.8 Forum 39
3.9 Magazin electronic 42
Nivelul interfeței cu utilizatorul cuprinde numeroase pagini, dintre care: 44
3.10 Încărcarea site-ului pe server 45
Concluzii 46
Bibliografie 48
48
Anexa 1 50
Anexa 2 66
Pagini 71
=== l (Repaired) ===
CUPRINS
INTRODUCERE 4
Capitolul 1. Afaceri electronice – concepte și caracteristici 6
1.1 Avantajele și dezavantajele unei afacerilor electronice 6
1.2 Modele de afaceri electronice 7
1.3 Modalități de plată online 10
1.4 Afacerile electronice în România 12
Capitolul 2. Tehonologia ASP.NET și limbajul XML 14
2.1. Platforma .NET și ASP.NET 14
2.2. Limbajul XML în contextul ASP.NET 16
Capitolul 3. Implementarea unei afaceri electronice de tip B2C prin ASP.NET și XML 17
3.1 Descrierea aplicației 17
3.2 Arhitectura aplicației 17
3.3 Proiectarea interfeței site-ului 19
3.4 Utilizatorii și conturile acestora 24
3.5 Administrarea articolelor 31
3.6 Chestionare 34
3.7 Newsletter 36
3.8 Forum 39
3.9 Magazin electronic 42
Nivelul interfeței cu utilizatorul cuprinde numeroase pagini, dintre care: 44
3.10 Încărcarea site-ului pe server 45
Concluzii 46
Bibliografie 48
48
Anexa 1 50
Anexa 2 66
INTRODUCERE
Conceptul de afacere electronică (sau e-business) se referă la organizarea tranzacțiilor, comunicațiilor și informațiilor precum și la planificarea și controlul unei afaceri, folosind întregul potențial al tehnologiei informației.
Termenul de "e-business" a fost utilizat pentru prima dată de IBM pentru a defini utilizarea tehnologiilor Internet pentru îmbunătățirea și transformarea procesele cheie dintr-o afacere. În definiția dată de IBM, e-business reprezintă o modalitate de "acces securizat, flexibil și integrat pentru desfășurarea diferitelor afaceri prin combinarea proceselor și sistemelor care execută operații de bază ale afacerilor cu cele ce fac posibilă găsirea informațiilor pe Internet".
E-business reprezintă un nou mod de a face afaceri, un nou mod de a folosi tehnologia și un nou mod de crea companii. Nu mai este nici un secret pentru nimeni că Internetul a revoluționat lumea afacerilor, care este in permanentă schimbare încercând să se adapteze la nevoile pieței digitale.
În condițiile în care Internetul a devenit parte integrantă din societatea statelor dezvoltate, acest mediu nou nu putea să scape atenției comercianților. Creat inițial pentru schimbul de informatii și pentru posta electronică, el a devenit cel mai dinamic mediu de afaceri.
Noua societate informațională aduce cu sine o serie de oportunități deosebite: constrângerile spațiale si temporale în materie de comunicații au fost mult reduse, informațiile pot fi prelucrate, stocate și transferate rapid, prețurile serviciilor legate de transferul informației sunt în continuă scădere.
În ceea ce privește afacerile electronice, există o multitudine de categorii în care acestea sunt împarțite. Indiferent de tipul unei afaceri electronice, comerțul electronic apare ca parte integrată a acesteia. Cumpărarea, vânzarea, schimbul de produse, servicii sau informații prin intermediul rețelelor de calculatoarelor au la bază un site Web administrat de firma ce conduce afacerea respectivă.
Realizarea unui site Web presupune parcurgerea unor serii de etape, fiecare etapă putând fi realizată prin utilizarea uneia sau mai multor tehnologii de programare după cum urmează:
– prezentarea documentului la nivelul clientului – JavaScript, applet-uri Java, DHTML, DOM
– generarea documentului la nivelul serverului – CGI, PHP, ASP.NET, ISAPI
– transformarea datelor XML in pagini HTML – XSL, CSS
– stocarea,structurarea și interogarea datelor – XML, XQL, SQL, CGI
Pe lângă aceste tehnologii, realizarea site-ului se poate face și prin achiziționarea unei platforme software pentru dezvoltarea afacerilor electronice, soluții ce permit, în general, generarea automată a unui sistem și adaptarea sa conform particularităților afacerii, dorințelor beneficiarului și complexității dorite.
Din multitudinea de platforme software existente, cele mai utilizate platforme pentru afaceri electronice care s-au impus pe piață sunt: Microsoft Commerce Server 2002, IBM-Lotus Domino și Oracle Application Server 10g.
Această lucrare face o descriere a realizării unui site Web în condițiile de afacere
electronică accentul punându-se pe tehnologiile ASP.NET și XML. Descrierea realizării site-ului se face pornind de la un exemplu practic și anume site-ul „Carți Și Ceai”, o afacere electronică ce se încadrează în categoria B2C (Business to Consumer).
Deasemenea lucrarea face o prezentare a tipurilor de afaceri electronice, a modalităților de plată online și o descriere a afacerilor electronice în România din punct de vedere economic.
Capitolul 1. Afaceri electronice – concepte și caracteristici
Astăzi, Internetul funcționează ca sursă de informații, ca sursă de divertisment, ca un canal de comunicații și chiar ca un canal de distribuție. Însă pe lângă toate acestea Internetul funcționează ca un mediu dinamic de afaceri în continuă schimbare și dezvoltare.
într-adevar, Internetul primește o atenție tot mai sporitǎ din partea antreprenorilor și investitorilor, iar în ultimii ani numǎrul persoanelor care acceseazǎ Internetul pentru știri, informații, comunicare sau entertainment a ajutat piața sǎ se dezvolte. Internetul ajutǎ consumatorii sǎ găsescǎ volume imense de informații, astfel încât decizia de cumpǎrare a unui produs/serviciu sǎ aibǎ la bază o documentare mult mai eficientǎ.
Chiar dacǎ formele tradiționale de afaceri își au încǎ locul lor, într-o lume în care 1 $ din 8 este cheltuit online, aceste medii clasice nu pot face fațǎ singure.
1.1 Avantajele și dezavantajele unei afacerilor electronice
Afacerile derulate pe Web au mai mult sau mai puțin aceleași caracteristici cu afacerile derulate în maniera tradițională dând posibilitatea firmei de a se prezenta în fața cliențiilor săi, oferindu-le produsele/serviciile sale.
Din punctul de vedere al firmei avantajele unei afaceri electronice sunt:
– facilitează extinderea activității, asigurând acces rapid la piețele locale, naționale și nu în ultimul rând la piețele internaționale
– scăderea costurilor cu desfășurarea activității firmei, în special acelea cu realizarea, procesarea, distribuirea, păstrarea și regăsirea informațiilor păstrate pe hârtie; în cazul afacerilor electronice sunt folosite soluții informatice, automatizate, pentru aceste activități.
– creează posibilitatea modelării facile a produselor și serviciilor conform nevoilor cumpărătorilor
– costurile de comunicație, transport sunt mult reduse
Din punctul de vedere al consumatorilor avantajele unei afaceri electronice sunt:
– oferă posibilitatea consumatorilor să cumpere sau să efectueze tranzacții 24h/zi în tot timpul anului din aproape orice locație
– cumpărătorii pot să aleagă mai ușor cel mai mic preț pentru un produs sau serviciu
– consumatorii pot să primească informație relevantă într-un timp foarte scurt, în câteva secunde și nu zile sau chiar săptămâni cum este cazul în multe afaceri tradiționale
– facilitează competiția ceea ce duce la scăderea prețurilor produselor și serviciilor
– permite consumatoriilor să interacționeze cu alți cumpărători prin intermediul comunităților electronice, să schimbe impresii și să-și compare experiențele
Pe lângă avantajele mentionate mai sus, afacerile electronice au și o serie de limite, dezavantaje:
– o întreținere proastă din punctul de vedere a securității site-ului poate produce pagube și fraude atât firmelor cât și consumatorilor
– conflicte pe canalele de distribuție
– îngustarea pieței preponderent către produsele/serviciile de larg consum
– efecte negative asupra mediului de afaceri existent
1.2 Modele de afaceri electronice
Simpla prezență online, câteva bannere publicitare pe diverse site-uri, urmate apoi de o perioada de așteptare a clienților nu asigura succesul unei afaceri electronice.
Realitatea demonstrează ca o afacere online trebuie tratată cu toată seriozitatea, la fel ca oricare altă afacere. La fel ca în cazul afacerilor tradiționale, trebuie să existe un plan de afaceri foarte bine pus la punct și nu în ultimul rând trebuie să fie foarte realist ținând cont de caracteristicile comerțului electronic.
Există posibilitatea ca numai anumite activități din cele ale afacerilor tradiționale să fie automatizate. Astfel afacerile electronice pot fi parțiale sau totale și ele presupun desfășurarea a cel puțin uneia din următoarele activități:
– prezența on-line (existența unui site de prezentare)
– comanda on-line
– plata on-line
– transmiterea on-line a produsului sau serviciului (produse software, cărți electronice, servicii bancare, etc.)
Datorită ritmului continuu de creștere a utilizatorilor de Internet, precum și datorită creșterii valorii tranzacțiilor efectuate online, afacerile electronice sunt prezente în diverse domenii și se împart în diverse categorii, cele mai importante fiind:
Business to Business (B2B) – reprezintă un model de afacere electronică în care tranzacțiile au loc între companii sau oraganizații. Acest tip de afaceri folosește ca mediu de comunicare Extranetul, spre deosebire de celelalte tipuri de afaceri ce folosesc Internetul ca mediu de comunicare.
Tipul acesta de afacere electronică poate fi mult mai eficient decat cel clasic, business-to-consumer, întrucât antrenează o formă de comunicare rapidă între entități similare și conectează companii din întreaga lume prin intermediul platformelor online. Orice operațiuni de vânzare și cumpărare între brokeri, diverși comercianți până la cele mai variate comunități de business se pot face simplu si rapid.
Business to Consumer (B2C) – reprezintă un model de afacere electronică ce se referă la vânzarea produselor și/sau serviciilor pentru consum personal. Cumpăratorii sunt indivizi, familii sau alte grupuri care cumpără produsele/serviciile pentru satisfacerea nevoilor personale.
Companiile oferă persoanelor fizice, prin intermediul magazinele on-line (eShop) o serie de servicii similare celor ale comerțului tradițional: informatii despre produsele-serviciile oferite, oferte speciale, discount-uri, plata electronică a produselor achiziționate, achiziționarea de produse. Un magazin virtual conține un catalog de produse și/sau servicii cu descrierea aferentă. Catalogul este gestionat prin intermediul unui Sistem de Gestiune al Bazelor de Date (SGBD) prin intermediul căruia care sunt stocate și actualizate informațiile privind produsele și/sau serviciile oferite . Magazinele electronice includ funcții pentru căutarea și vizualizarea produsele, preluarea comenzilor și efectuarea plăților. Exemple de afaceri B2B sunt: www.amazon.com, www.dell.com, www.wallmart.com, www.emag.ro, www.dol.ro, iar ca soluții de plată online: www.paypall.com ,www.epayment.ro.
Consumer to business (C2B) – acest model de afacere electronică se referă la persoanele fizice (consumatori) care utilizează Internetul pentru a-și vinde produsele sau serviciile firmelor și/sau căuta vânzători să liciteze pentru produsele sau serviciile de care au nevoie.
Consumer to consumer (C2C) – reprezintă un model de afacere electronică în care tranzacțiile au loc între consumatori prin intermediul unei a treia părți (site-ul unde au loc tranzacțiile). Un exemplu potrivit sunt licitațiile online (e-auctions) în care un consumator ofera un produs spre vânzare, iar alt consumator îl cumpără. În general a treia parte încaseaza un comision pentru tranzacția dintre cei doi consumatori. Compania care administreaza site-ul are doar rol de intermediar nu testeaza si nu asigura calitatatea produselor comercializate. Ca exemplu:www.ebay.com, www.okazii.ro.
M-commerce (comerțul mobil) – tranzacțiile online efectuate cu ajutorul dispozitivelor portabile: PDA-uri, agende electronice și, mai ales, telefoane celulare. Cele mai frecvente servicii oferite sunt livrarea de informații, vânzarea de bilete la spectacole etc.
E-banking – presupune realizarea de tranzacții bancare on-line, transfer de bani din conturile deschise la bănci, plăți electronice, consultanță bancară.
E-directories – cataloagele de informații sunt site-uri care își organizează informațiile pe categorii de concepte. Regăsirea informațiilor se face pe baza unor arbori de căutare. Exemple de cataloage virtuale: www.yahoo.com, www.dmoz.org, www.paginiaurii.ro
E-engineering – pentru proiectarea electronică distribuită realizată pe Web.
E-gambling – jocuri de noroc online; exemple: www.gamebookers.com,
www.partypoker.com
E-learning – invatamant online; exemple: www.brainbench.com, www.cursurionline.ro, www.online-learning.com .
E-mailing – serviciile de posta electronica
E-working – firme virtuale; exemplu: www.eworking.com
E-operational resources management – oferă echipamente de calcul, produse pentru întreținere și reparații.
E-procurement (aprovizionare electronică) – procurarea bunurilor și serviciilor de către marile companii și autorități publice
1.3 Modalități de plată online
În derularea afacerilor electronice, un aspect foarte important îl reprezintă
efectuarea plăților pentru produsele sau serviciile oferite.
Nivelul curent de securitate în Internet/Intranets permite utilizarea modalităților de plata online. Multe dintre procedeele utilizate în plati electronice prin Internet sunt similare celor utilizate într-un punct de vânzare obișnuit. Diferența principală este ca în cazul comerțului electronic totul decurge prin Internet utilizând servicii Web și alte servicii de transmisii digitale de date. Cerințele sunt similare celor din sistemele clasice: autentificare si autorizare, confidențialitate, siguranță. Dintre cele mai răspândite metode utilizate în afacerile electronice se regăsesc:
– carți de credit – sistemul de cărti de credit a fost creat cu intenția de a-i permite cumpărătorului sa-și satisfacă imediat dorinta de cumpărare de bunuri și servicii. Prin cartea de credit riscul este transferat de la vânzator la instituția financiara care a emis cartea de credit. Cumpărătorul prezintă vânzatorului cartea de credit. Vânzatorul trimite numărul carții de credit si detaliile tranzacției la un sistem de autorizare. Acesta fie autorizează direct tranzacția, fie o directionează la bancă emitentă a cărtii de credit, pentru aprobare. Periodic (de exemplu, zilnic) vânzatorul trimite detaliile tranzacțiilor aprobate către banca sa. Aceste informații sunt trimise la asociația emitenților de cărti de credit dupa ce au fost procesate tranzacțiile pentru care banca respectivă este și colectoare si emițătoare de carte de credit. La sfarșitul lunii, consumatorul primeste facturile pe care trebuie sa le achite, altfel va plăti dobânda pentru creditul acordat de banca ce a emis cartea de credit.
– gift certificates – utilizând diverse sisteme de plată (cash, cărți de credit) o persoană poate cumpăra un astfel de certificat având o anumită valoare. Certificatul este transmis unei alte persoane (cadou), aceasta putând efectua plăți (în limita sumei înscrisă pe certificat) în foarte multe magazine virtuale.
– PayPal – tranzacțiile se desfășoară între vânzător și cumpărător, care trebuie sa-și creeze un cont de utilizator PayPal. Există mai multe tipuri de conturi, iar plățile se realizează prin mai multe metode.
– CyberCash – pentru a efectua plăți prin CyberCash, consumatorul are nevoie de un software care simulează "portofelul", face criptarea mesajelor si memoreaza tranzacțiile. Ca și portofelul obișnuit, acest portofel-software poate înregistra mai multe cărti de credit. Vânzatorul are un software similar. Utilizând un navigator Web, consumatorul selectează ce vrea să cumpere. Serverul vânzătorului trimite "portofelului-software" o cerere de plată semnată prin care dă detalii despre cumpărătura și transmite tipul cărților de credit acceptate. "Portofelul" deschide o fereastra și afișează suma si lista cărților de credit disponibile pentru selecție. "Portofelul" trimite un mesaj criptat si semnat cu numărul cărții de credit și detalii privind tranzacția si acceptarea plătii. Serverul vânzătorului trimite acest mesaj împreună cu un mesaj propriu semnat si criptat către Gateway. Aici mesajele sunt decriptate si comparate, iar dacă se potrivesc, se trimite o cerere de autorizare conventională. Reîntoarce un răspuns spre vânzătorul care trimite un răspuns "carte de credit" către software-ul portofel. Gateway-ul este operat de un agent al băncii colectoare a vânzătorului.
– SmartCard – este în esență înlocuitorul portofelului obișnuit. Tot conținutul unui portofel actual (acte, cărți de credit, bani gheață) va fi înlocuit de una sau mai multe Smart Card-uri. Din punct de vedere fizic, Smart Card arată ca o carte de credit cu unul sau mai multe microcircuite de tip "microcontroller"-e înglobate. O cartelă inteligentă (Smart Card) poate păstra de 10 – 100 ori mai multe informații decât o cartelă magnetică, fiind totodată mult mai sigură. Conectată la un terminal de citire/scriere, Smart Card poate efectua funcții complexe de luare a deciziilor, proceduri sofisticate de autentificare pentru a preveni frauda. Deci beneficiile oferite de Smart Card sunt: sigurantă, capabilităti active antifrauda, flexibilitate în aplicații, posibilitatea de validare "off-line". De asemenea, Smart Card poate fi combinată cu date biomotrice – amprentă digitală, geometria mâinii, amprentă vocala etc., pentru a-și identifica în mod unic proprietarul. Există deja multe aplicații în telefonie celulara (GSM), acces Internet, aplicații financiare. Pentru a efectua operații cu Smart Card, aceasta se introduce într-un dispozitiv de citire/scriere care poate fi cu contact sau fara contact. Acest cititor poate fi sub forma unui portofel ce poate comunica cu alt portofel similar sau cu banca, pentru efectuarea de transferuri multivalutare. Astfel, Smart Card memorează direct echivalentul digital al sumelor de bani în loc să indice un cont la banca sau un credit acordat de banca. Când o astfel de cartelă este utilizată pentru a cumpara ceva, echivalentul sumei respective este efectiv transferat vânzătorului și apoi mai departe spre o instituție financiară. Smart Card poate fi reîncărcabilă sau nu. În acest ultim caz cartela se aruncă atunci când suma înscrisa în ea a fost epuizată.
1.4 Afacerile electronice în România
Afacerile electronice și mai ales componenta lor principală, comerțul electronic (apărut în România la sfarșitul lui 1999), înca nu sunt atât de dezvoltate pe cât s-ar dori, deși în ultimii ani au avut loc progrese semnificative. Clienții manifestă temeri în ceea ce privește furtul cardurilor de credit, a confidențialitații datelor personale, etc. Multe firme nu au adoptat modelul electronic potrivit pentru derularea afacerilor lor electronice sau întampina dificultăți în integrarea comenzilor și a informațiilor culese online, în activitatea curenta a firmei. Cu toate acestea, este o certitudine faptul că numărul clienților magazinelor electronice și a firmelor care adoptă soluțiile comerțului electronic este în creștere. Mulți furnizori de servicii Internet popularizează sistemul de cumpărare online tocmai pentru a induce un plus de încredere și considerație.
În România situația este departe de cea a americanilor, de exemplu, care acorda o atenție specială acestui tip de cumparături. Românii sunt încă tributari prejudecăților conform cărora bunul cumpărat trebuie sa fie palpat, măsurat și întors pe toate părțile. În ultimii ani a aparut însa o noua categorie socială, cea a persoanelor care lucrează în mediul privat, au un anumit stil de viată și utilizează intensiv Internetul. Pentru aceștia cumpărăturile online, cu avantajele lor evidente, încep sa devină ceva obișnuit.
Cel mai folosit sistem de monitorizare web in România este www.trafic.ro. Conform acestui site, topul primelor 10 site-uri de afaceri electronice, la sfarșitul lunii februarie 2008, arăta astfel:
Locul 1: www.okazii.ro – licitații online
Locul 2: www.price.ro – comparații între produsele oferite de diverse magazine online
Locul 3: www.librarie.net – librărie si anticariat online
Locul 4: www.shopmania.ro comparații între diverse oferte ale magazinelor online
Locul 5: www.domo.ro – magazin online de produse electrocasnice, electronice și IT&C
Locul 6: www.comparari.ro – comparații între produsele oferite de diverse magazine online
Locul 7: www.pcgarage.ro – magazin online de echipamente IT&C
Locul 8: www.dc-shop.ro – magazinul online al firmei Depozitul de Calculatoare
Locul 9: www.cauti.ro – comparații între produsele oferite de diverse magazine online
Locul 10:www.magazine-online.ro – director de magazine virtuale cu posibilitate de comercializare produse online.
O dovadă de maturitate a afacerilor electronice in România este prezența în top 10 a trei site-uri, price.ro, shopmania.ro, comparări.ro, care oferă un sistem de comparare a produselor oferite de diverse magazine online.
Un alt aspect important este reprezentat de prezența între primele zece site-uri de comerț electronic a doua magazine online care comercializeaza produse IT, electronice, telefoane si/sau electrocasnice. În concluzie, se observa că magazinele online care ofera produse IT au cautare în spatiul virtual românesc. Aceasta ne confirmă faptul că în România Tehnologia Informației ocupă un loc foarte important și cei care dispun de un PC în general sunt primii care apelează cu mai multa încredere la aceste servicii.
Capitolul 2. Tehonologia ASP.NET și limbajul XML
2.1. Platforma .NET și ASP.NET
Microsoft .NET este o platformă de dezvoltare software, care are menirea de a oferi programatorilor un mediu de programare în care sunt puse la dispoziție diverse servicii cum sunt: managementul firelor de execuție, managementul duratei de viață a obiectelor (Garbage Collection), tratarea excepțiilor, etc; și care determină o viteză mult mai mare a dezvoltării aplicațiilor decât pe platforma Win32, adică direct pe sistemul de operare Windows.
Inovația adusă de Microsoft, constă în dezvoltarea unei platforme comune pentru mai multe limbaje de programare, platformă care permite dezvoltarea unei aplicații în orice limbaj compatibil cu platforma .NET (Figura 2.1). Acest lucru este posibil prin dezvoltarea unui interpretator – Common Language Runtime – care transformă codul de program dintr-un limbaj oarecare, compatibil cu platforma .NET, în limbajul Microsoft Intermediate Language. Codul rezultat în limbajul Microsoft Intermediate Language, se poate apoi compila pentru orice sistem de operare care are instalat .NET Framework. Datorită platformei .NET, pot fi înglobate cu ușurință în aplicațiile Web toate componentele care erau până acum caracteristicile doar mediului Windows.
Figura 1.1 – Platforma .NET raportat la sistemul de operare și la aplicația Visual Studio .Net
Sursa: http://msdn.microsoft.com/en-us/netframework/aa663326.aspx
Paginile web dinamice create cu ajutorul ASP.NET pot îngloba mai multe tipuri de tehnologii Web existente. De asemenea, scripturile din fișierele ASP.NET pot fi și ele de mai multe tipuri (vbscript, javascript, active server).
Printre limbajele care suportă .NET, în primul rând trebuie amintite cele dezvoltate de Microsoft – VB.NET, C# .NET, Visual C++ .NET, cât și limbajele dezvoltate de alte firme: Borland C#, Cobol, Eiffel, Perl, Phyton, Smalltalk, Pascal, Fortran, etc.
ASP.NET este o tehnologie Microsoft pentru crearea de aplicații web și servicii web. ASP.NET este succesorul lui ASP (Active Server Pages) și beneficiază de puterea platformei de dezvoltare .NET și de setul de instrumente oferite de mediul de dezvoltare al aplicației „Visual Studio .NET”. Câteva dintre avantajele ASP .NET sunt:
– are un set larg de componente, bazate pe XML, oferind astfel un model de programare orientat obiect (OOP).
– ruleaza cod compilat, ceea ce crește performanțele aplicației web. Codul sursă poate fi separat în două fișiere, unul pentru codul executabil, iar un altul pentru conținutul paginii (codul HTML și textul din pagină) .
– este compatibil cu peste 20 de limbaje diferite, cele mai utilizate fiind C# si Visual Basic.
Serverele Web care suportă tehnologia ASP.NET sunt următoarele:
– PWS – Personal Web Server (Windows 98, Me)
– IIS – Internet Information Server (Windows NT, 2000, XP Professional).
Microsoft ASP .NET este următoarea generație a tehnologiei de dezvoltare a
aplicațiilor Web. Ea preia tot ce este mai bun de la Active Server Pages (ASP) la fel ca și
serviciile bogate și facilitățile oferite de Common Language Runtime (CLR) și multe alte
noi facilități. Rezultatul este o nouă modalitate de dezvoltare web rapidă, scalabilă și robustă care permite o mare flexibilitate cu foarte puține linii de cod scrise.
2.2. Limbajul XML în contextul ASP.NET
Xml (eXtensible Markup Language) este un limbaj care permite definirea documentelor ce conțin informații într-un mod structurat. Informația structurată dintr-un document Xml are atât conținut (cuvinte, imagini, etc.), cât și o indicație despre rolul pe care îl are acel conținut (de exemplu conținutul din secțiunea antet are alt rol fața de cel din subsol, care la rândul lui e diferit de conținutul dintr-un tabel al unei baze de date). Toate documentele au o anumită structură. Aceste structuri se construiesc utilizând marcatori.
Cu alte cuvinte Xml permite definirea de tag-uri precum și relația dintre acestea. Deoarece nu există o mulțime de tag-uri predefinită, nu există nici o semantică asociată cu acestea. Definirea semantică a documentelor Xml este o sarcina a aplicațiilor care folosesc documentele respective sau a foilor de stiluri.
Avantaje Xml:
– Xml descrie conținutul și structura acestuia
– informația este mai ușor de găsit și manipulat daca este în format Xml
– XML oferă facilități multiple și îmbunătățite de prezentare (de exemplu folosind browserele)
Combinarea limbajului Xml cu tehnologia ASP.NET oferă o gamă largă de posibilități, .NET încorporând Xml în părți cheie ale platformei.
În ASP.NET informațiile pentru configurarea unei aplicații Web sunt stocate în fișiere Xml de configurare. Prezentate într-un format ușor de înțeles, aceste fișiere (în cadrul unei aplicații pot exista mai multe fișiere de configurare în directoare diferite) numite web.config, sunt folosite de regulă pentru securitate, dar și pentru stocarea unor informații gen constante care să poată fi regăsite din codul executabil. Un fișier web.config este securizat neputând fi vizualizat prin intermediul unui browser.
Un avantaj al stocării unor astfel de constante în web.config este că modificările în acest fișier nu atrag după sine necesitatea de recompilare a aplicației
ASP.NET mai utilizează limbajul Xml și în fișierele cu extensia .sitemap organizând paginile site-ului respectiv într-un mod ierarhic și creând o harta a acelui site.
Capitolul 3. Implementarea unei afaceri electronice de tip B2C prin ASP.NET și XML
3.1 Descrierea aplicației
Acest capitol din lucrare are menirea de a prezenta modul de implementare a funcționalităților site-ului „Cărți și Ceai”, aplicație de afaceri de tip B2C.
„Carți și Ceai” este site-ul unui magazin ce reunește cărțile, ceaiul, muzica și expozițiile de artă sub același acoperiș. Conștienți fiind de puterea mediului de afaceri electronic, cei din conducerea magazinului au văzut completarea afacerii tradiționale cu afacerea electronică drept o necesitate.
Știind că o afacere electronică înseamnă mult mai mult decât vânzarea și cumpărarea de bunuri, site-ul „Cărți Și Ceai” are grijă să ofere mult mai mult clienților săi prin funcționalități precum articole despre anumite subiecte de interes, newslettere, chestionare, forum, conturi de utilizator și nu în ultimul rând magazin electronic.
3.2 Arhitectura aplicației
Din punctul de vedere al arhitecturii, site-ul „Cărți Și Ceai” respectă un model arhitectural pe trei nivele (arhitectură multi-nivel sau multi-tier) astfel:
– nivelul de acces la date (DAL – Data Access Layer) aici rezidă codul care se ocupă cu accesul la baza de date, la fișiere, la alte servicii.
– nivelul de logică al aplicației (BLL – Business Logic Layer) se ocupă de tot ceea ce este specific aplicației care se dezvoltă. Aici se efectuează calculele și procesările și se lucrează cu obiecte de tipuri definite de programator.
– nivelul de prezentare (UI – User Interface, interfața cu utilizatorul) se ocupă numai de afișarea informațiilor către utilizator și captarea celor introduse de acesta. Nu cuprinde detalii despre logica aplicației, și cu atât mai mult despre baza de date sau fișierele pe care aceasta le utilizează.
Separarea în cadrul proiectului a celor trei nivele s-a facut atât prin directoare diferite pentru fiecare nivel (App_Code/DAL, App_Code/BLL și directorul radacină cu subdirectoarele sale) cât și prin utilizarea de namespace-uri (CSC.CărțiȘiCeai.DAL, CSC.CărțiȘiCeai.BLL și CSC.CărțiȘiCeai.UI)
Datele referitoare la articole, utilizatori, magazin, forum, chestionare, newsletter au fost stocate într-o bază de date SQL Server 2005 Express Edition și manipulate prin proceduri stocate.
Fiecare modul din baza de date (articole, chestionare, forum, newslettere, utilizatori, magazin) are asociat câte o clasă abstractă și una sau mai multe clase ce au acces la date.
Înainte de a scrie clasele ce au acces la datele din baza de date s-au scris clase abstracte ce definesc interfața publică (signaturile metodelor de acces la date, CRUD) și implementează câteva metode pentru anumite setări. Clasele ce au acces la date (se mai numesc și clase furnizoare sau providers) sunt derivate din clasele abstracte și asigură implementarea pentru metodele abstracte.
Datele obținute din baza de date sunt prelucrate mai departe în cadrul nivelului de logică a aplicației pregătindu-le pentru interfața cu utilizatorul.
Pe lângă acestea site-ul are nevoie de anumite setări de configurare pe care toate cele trei niveluri le vor folosi. Nivelul de acces la date are nevoie de numele providerului la baza de date sau de stringul de conectare, nivelul de logică al aplicației are nevoie de setările pentru caching, iar nivelul de prezentare are nevoie de alte setări precum adresa destinatarului în cadrul secțiunii Contact. Toate aceste setări sunt salvate în fișierul de configurare web.config, iar accesul la ele se face prin clasa SectiuneCartiSiCeai derivată din System.Configuration.ConfigurationSection
3.3 Proiectarea interfeței site-ului
Primul pas în implementarea unei aplicații Web este proiectarea interfeței grafice, felul în care arată și ce transmite utilizatorului. Felul în care arată un site este extrem de important, iar fără a ține cont de acest lucru șansele ca vizitatorii să rămână cu o impresie proastă atât despre site cât și despre compania din spatele site-ului sunt foarte mari. Pe lângă toate acestea mai trebuie avut în vedere și faptul că nu toți utilizatorii au aceleași păreri sau folosesc aceleași browsere.
Pentru proiectarea interfeței site-ului „Cărți Și Ceai” s-au implementat următoarele facilități:
– o machetă grafică (layout) atractivă, identică pe browsere precum Internet Explorer, Mozilla Firefox, Opera și un mecanism de a schimba în mod dinamic diferite atribute (culoare, poziționarea elementelor) ale acestei machete
– o modalitate de distribuire aceluiași layout pentru fiecare pagină a site-ului fără copiere de cod
– un sistem de navigare intuitiv pentru utilizator cu posibilități de întoarcere la pagini anterior vizitate
Punctul de plecare în proiectarea interfeței a fost crearea unui model grafic (Figura 3.1) cu aplicația Adobe Photoshop 7.0. Acestei schițe i s-au adaugat imagini și culori folosite mai târziu în implementarea efectivă a interfeței grafice.
Figura 3.1- Layout site „Cărți Și Ceai”
Distribuirea aceluiași layout pentru fiecare pagină a site-ului, fără copiere de cod a fost posibilă prin utilizarea conceptului de master page. În cadrul tehnologiei ASP.NET 2.0 un master page este un formular web standard ce permite definirea de zone comune tuturor paginilor din cadrul site-ului.
O pagină de tip master page are extensia .master și conține unul sau mai multe controale ContentPlaceHolder. Celelalte pagini din cadrul site-ului preiau aspectul paginii de tip master și își plasează conținutul acolo unde există un control ContentPlaceHolder (Figura 3.2).
Legarea unei pagini de conținut de un master page se face prin atributul MasterPageFile fie la nivelul paginii respective (util când există definite mai multe pagini master) fie în cadrul fișierului de configurare web.config, variantă folosită și pentru site-ul „Cărți Și Ceai”.
Implementarea unui mecanism de a schimba în mod dinamic diferite atribute ale paginii de tip master se face prin utilizarea temelor (themes), o facilitate ce permite utilizatorilor de a avea mai mult control asupra aspectului paginilor web. O temă definește culorile, fonturile și dimensiunile acestora, stilurile, imaginile ce vor fi utilizate.
Fiecare utilizator are posibilitatea de a selecta o altă temă, decât cea implicită, din temele disponibile determinând astfel o nouă față pentru site. Site-ul „Cărți Și Ceai” utilizează două teme: NaturalGreen (implicită) și Sunset.
Figura 3.2 – Fuzionarea unei pagini obișnuite cu o pagina de tip master
O temă are în componența sa mai multe tipuri de fișiere și diferite resurse (de exemplu imagini) grupate într-un folder cu numele temei. Toate foldere aferente temelor sunt grupate la rândul lor în directorul App_Themes ( Figura 3.3 ).
Figura 3.3 – Conținutul subdirectorului App_Themes
Fișierele Default.css definesc stilul de afișare în pagină a obiectelor HTML utilizând și imagini, iar fișierele Controls.skin definesc aspectul controalelor ASP.NET.
Pentru a aplica o temă unei singure pagini se utilizează atributul Theme în directiva @Page:
<%@ Page Language="C#" Theme=”NaturalGreen” MasterPageFile="~/Template.master"… %>
Pentru a aplica o temă tuturor paginilor din cadrul site-ului se utilizează atributul theme în elementul <pagini> din cadrul fișierului de configurare web.config, modalitate folosită și pentru site-ul „Cărți Și Ceai”:
<pagini theme="NaturalGreen" masterPageFile="~/Template.master"…> </pagini>
Oricare vizitator al site-ului „Cărți Și Ceai” poate să-și aleagă tema dorită prin controlul de utilizator SelectorTeme1 definit în fișierul SelectorTeme.ascx și utilizat în Template.master. Conținutul fisierului SelectorTeme.ascx este destul de simplu după cum urmează:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SelectorTeme.ascx.cs" Inherits="SelectorTeme"
<b>Teme:</b>
<asp:DropDownList runat="server" ID="ddlTeme" AutoPostBack="True"/>
Completarea controlului DropDownList cu numele temelor disponibile se face în codul fișierului SelectorTeme.ascx.cs cu ajutorul metodei SetareTema din cadrul clasei Setari:
public partial class SelectorTeme : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{ if (Globals.IDSelectorTeme.Length == 0)
Globals. IDSelectorTeme = ddlTeme.UniqueID;
ddlTeme.DataSource = Setari.SetareTema()
ddlTeme.DataBind();
ddlTeme.SelectedValue = this.Page.Theme;
}
}
public static class Setari
{
public static string[] SetareTema()
{
if (HttpContext.Current.Cache["TemeSite"] != null)
{
return (string[])HttpContext.Current.Cache["TemeSite "];
}
else
{
string temeCaleDir = HttpContext.Current.Server.MapPath("~/App_Themes");
string[] teme = Directory.GetDirectories(temeCaleDir);
for (int i = 0; i <= teme.Length – 1; i++)
teme[i] = Path.GetFileName(teme[i]);
CacheDependency dep = new CacheDependency(temeCaleDir);
HttpContext.Current.Cache.Insert("TemeSite", teme, dep);
return teme;
}
}
}
Schimbarea temei în mod dinamic și păstrarea aceleiași teme pentru toate paginile site-ului (toate paginile vor avea același comportament) se face prin intermediul clasei BasePage pe care toate paginile o vor moșteni.
public class BasePage : System.Web.UI.Page
{
protected override void OnPreInit(EventArgs e)
{
string id = Globals.IDSelectorTeme;
if (id.Length > 0)
{
if (this.Request.Form["__EVENTTARGET"] == id && !string.IsNullOrEmpty(this.Request.Form[id]))
{
this.Theme = this.Request.Form[id];
this.Session[“CurrentTheme”]=this.Theme;
}
else
{
if(this.Session[“CurrentTheme”]!=null)
this.Theme=this.Session[“CurrentTheme”].ToString();
}
}
base.OnPreInit(e);
}
Alte elemente ce influențează impresia utilizatorului despre o aplicație web sunt meniurile și ușurința de navigare în paginile site-ului. Aplicația „Cărți Și Ceai” folosește un meniu intuitiv completat cu facilități de navigare contextuală (breadcrumb navigation), iar opțiunile meniului sunt specificate într-un fișier Xml cu extensia .sitemap.
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode title="Acasa" url="~/Default.aspx">
<siteMapNode title="Magazin" url="~/Magazin/Default.aspx">
<siteMapNode title="Cos cumparaturi" url="~/Magazin/CosCumparaturi.aspx" />
</siteMapNode>
<siteMapNode title="Forum" url="~/Forum/Default.aspx" />
<siteMapNode title="Despre" url="~/Despre.aspx" />
<siteMapNode title="Contact" url="~/Contact.aspx" />
<siteMapNode title="Admin" url="~/Admin/Default.aspx" />
</siteMapNode>
</siteMap>
Odată definit acest fișier poate fi folosit ca sursă de date pentru diferite controale (Menu, TreeView, etc). Deasemenea pe lângă aceste elemente ASP.NET dispune și de controale nonvizuale DataSource, ce în cadrul aplicției „Cărți Și Ceai” au fost folosite pentru a lega controalele Menu de fișierul web.sitemap.
Pentru a ușura navigarea în paginile site-ului este implementat un sistem de navigare contextuală ce oferă indicii utilizatorilor cu privire la locația acestora în cadrul site-ului precum și posibilitatea de întoarcere la pagini anterior vizitate făra a folosi meniul browserului. Acest lucru este realizat printr-o singură linie de cod în cadrul paginii Template.master:
<asp:SiteMapPath ID="SiteMapPath1" runat="server"/>
3.4 Utilizatorii și conturile acestora
Atât într-o afacere tradițională cât și în una electronică mulțumirea clientului este vitală. Pentru a menține un feedback cu utilizatorii, site-ul „Cărți Și Ceai” pune la dispoziția acestora secțiunea Contact. Simpla completare online a unui formular și apăsare a butonului „Trimite” îi permite utilizatorului să trimită un mail administratorului site-ului.
protected void txtTrimite_Click(object sender, EventArgs e)
{
try
{
MailMessage msg = new MailMessage();
msg.IsBodyHtml = false;
msg.From = new MailAddress(txtEmail.Text, txtNume.Text);
msg.To.Add(new MailAddress(Globals.Settings.ContactForm.MailTo));
if (!string.IsNullOrEmpty(Globals.Settings.ContactForm.MailCC))
msg.CC.Add(new MailAddress(Globals.Settings.ContactForm.MailCC));
msg.Subject = string.Format(
Globals.Settings.ContactForm.MailSubiect, txtSubiect.Text);
msg.Body = txtContinut.Text;
SmtpClient mailcl = new SmtpClient("smtp.gmail.com");
NetworkCredential credentials = new NetworkCredential("[anonimizat]", "parolasecreta");
mailcl.EnableSsl = true;
mailcl.UseDefaultCredentials = false;
mailcl.Credentials = credentials;
mailcl.Send(msg);
lblFeedbackOK.Visible = true;
lblFeedbackKO.Visible = false;
txtNume.Text = "";
txtEmail.Text = "";
txtSubiect.Text = "";
txtContinut.Text = "";
}
catch (Exception)
{
lblFeedbackOK.Visible = false;
lblFeedbackKO.Visible = true;
}
}
Setările pentru SMTP sunt definite în fișierul web.config în secțiunea <mailSettings> astfel:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network">
<network host="smtp.gmail.com" password="" userName="" />
</smtp>
</mailSettings>
</system.net>
Secretul oricărui site de acest gen pentru a avea succes constă în comunitatea utilizatorilor. O comunitate numeroasă a utilizatorilor va crește atât popularitatea site-ului cât și câștigul acestuia de pe urma vânzarilor.
Vizitatorii site-ului „Cărți Și Ceai” sunt încurajați să se înregistreze pe gratis pentru a putea participa cu mesaje în forum, pentru a avea acces la newslettere și nu în ultimul rând pentru a putea comanda cărți din magazinul electronic. Odată înregistrați utilizatorii devenind membrii ai site-ului.
Privind acest aspect, site-ul „Cărți Și Ceai” oferă următoarele facilități utilizatorilor și administratorului:
– creare de conturi de utilizator individuale cu nume și parolă completând online un formular de înregistrare
– posibilitatea ca un utilizator să-și schimbe datele introduse la înregistrare sau să-și recupereze parola în cazul în care a uitat-o
– posibilitatea ca administratorul să permită sau să refuze accesul la anumite secțiuni/pagini pentru anumiți utilizatori
– suspendarea temporară sau permanentă a unui cont de utilizator de către administrator
– accesul administratorului la informații precum numărul total de utilizatori înregistrați sau numărul de utilizatori online la un moment dat
– salvarea unor date specifice contului (tema site-ului, datele de utilizator) de către membrii site-ului
Înregistrarea pe site este gratuită și se face prin completarea unui formular de înregistrare cu datele necesare (nume de utilizator, parolă, e-mail, o întrebare de siguranță precum și răspunsul aferent acesteia).
Pentru reținerea parolei utilizatorului există mai multe metode din care cele mai cunoscute sunt următoarele:
– stocarea parolei ca text într-un câmp din baza de date, metodă convenabilă atât pentru programatori, administratori, dar mai ales pentru utilizatori care vor primi parola prin email în cazul în care au uitat-o.
– ca masură de securitate înainte de a fi stocată în baza de date parola este criptată; cea mai comună metodă de criptare a parolei este criptarea simetrică, putând fi și decriptată. La fel ca în cazul primei metode utilizatorul poate primi parola prin email în cazul în care a uitat-o
– a treia metodă previne accesul programatorului sau a administratorului la parola utilizatorului, criptarea facându-se într-un singur sens (criptare hashing), odată ce a fost criptată nu mai poate fi decriptată; în cazul în care un utilizator și-a uitat parola primește un email cu o noua parolă
Site-ul „Cărți Și Ceai” folosește a doua metodă de reținere a parolei, iar autentificarea utilizatorilor se relizează prin completarea casuței de login (forms authentication).
Clasele System.Web.Security.Membership și MembershipUser din ASP.NET 2.0 oferă un număr considerabil de metode pentru crearea, ștergerea, modificarea și identificarea utilizatorilor înregistrați. Prin utilizarea acestor două clase s-au putut administra datele referitoare la membrii site-ului „Cărți Și Ceai” și conturile acestora.
Pe lângă aceste clase ASP.NET 2.0 mai dispune și de setul de controale pentru login, ce asigură interfața pentru cele mai folosite operații legate de înregistrare, autentificare, recuperarea parolei sau schimbarea acesteia. Pentru crearea unui nou cont de utilizator s-a folosit un control de tip CreateUserWizard, a cărui cod arata inițial astfel:
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
<WizardSteps>
<asp:CreateUserWizardStep runat="server">
</asp:CreateUserWizardStep>
<asp:CompleteWizardStep runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
Figura 3.4 – Crearea unui nou cont de utilizator
Controlul Login face exact ce îi sugerează numele: permite utilizatorilor să se autentifice, oferind interfața potrivită pentru introducerea numelui și a parolei. Acest control apelează metoda Membership.ValidateUser pentru a verifica daca datele introduse de utilizator se află încă în baza de date, iar dacă sunt găsite apelează FormAuthentification.RedirectFormLoginPage.
Controlul ChangePassword permite utilizatorilor să-și schimbe parola prin completarea unui formular sau să-și recupereze parola în cazul în care au uitat-o.
Controalele LoginStatus, LoginName și LoginView sunt cele mai facile în utilizare din punctul de vedere al programatorului. LoginName afișează numele utilizatorului autentificat prin proprietatea FormatString. LoginStatus arată un link pentru logare sau delogare depinzând dacă utilizatorul este sau nu autentificat. LoginView arată diferite formate ale site-ului tot depinzând daca utilizatorul este autentificat sau nu.
Un sistem de autentificare nu ar fi complet fără rolurile asociate membrilor. Rolurile sunt folosite pentru a grupa utilizatorii pe diferite categorii: administratori, editori, colaboratori, administratori magazin etc. Deasemenea există posibilitatea de a asigna unui utilizator multiple roluri. Pentru ca site-ul „Cărți Și Ceai” să suporte această facilitate s-au specificat setările necesare în fișierul de configurare web.config astfel:
<roleManager enabled="true" cacheRolesInCookie="true" cookieName="CSCROLES">
System.Web.Security.Roles este clasa folosită pentru accesarea și administrarea informațiilor despre roluri printr-o serie de metode (AddUsrToRole, AddUserToRoles, CreateRole, DeleteRole, FindUsersInRole, GetAllRoles, RemoveAllUserFromRole, etc).
Controlarea accesului la anumite pagini din cadrul site-ului în funcție de rolul pe care îl are utilizatorul respectiv se poate face atât prin cod cât și direct în fișierul de configurare, web.config:
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
În cazul în care utilizatorul nu are acces la o anumită secțiune a site-ului apare pagina AccesRespins.aspx (Figura 3.5).
Figura 3.5 – Pagina AccesRespins.aspx
Pentru administrarea profilurilor utilizatorilor, ASP.NET 2.0 dispune de un mecanism încorporat pe cât de complet pe atât de flexibil, salvând enorm de mult timp programatorului. Toate setările sunt făcute prin intermediul fișierului de configurare:
<profile defaultProvider="CSC_ProfileProvider">
<providers>
<add name="CSC_ProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
<properties>
<add name="Prenume" type="String" />
<add name="Nume" type="String" />
<add name="Sex" type="String" />
<add name="DataNasterii" type="DateTime" />
<add name="Ocupatie" type="String" />
<add name="Site" type="String" />
<add name="CosCumparaturi" type="CSC.CartiSiCeai.BLL.Magazin.CosDeCumparaturi" serializeAs="Binary" allowAnonymous="true" />
<group name="Forum">
<add name="Postari" type="Int32" />
<add name="UrlAvatar" type="String" />
</group>
<group name="Adresa">
<add name="Strada" type="String" />
<add name="CodPostal" type="String" />
<add name="Oras" type="String" />
<add name="Stat" type="String" />
<add name="Tara" type="String" />
</group>
<group name="DateContact">
<add name="Telefon" type="String" />
<add name="Fax" type="String" />
</group>
<group name="Preferinte">
<add name="Teme" type="String" allowAnonymous="true" />
<add name="Newsletter" type="CSC.CartiSiCeai.BLL.Newslettere.SubscriptionType" />
</group>
</properties>
</profile>
Administrarea efectivă a membrilor site-ului „Cărți Și Ceai”se face prin intermediul paginii ~/Admin/AdminUseri.aspx. Interfața acestei pagini poate fi împărțită în trei secțiuni:
– prima informează administratorul cu privire la numărul de utilizatori înregistrați și câți din aceștia sunt online
– a doua parte oferă controale pentru găsirea utilizatorilor după anumite criterii
– ultima parte folosește un control de tip GridView pentru listarea utilizatorilor înregistrați
Figura 3.6 – Pagina AdminUseri.aspx
3.5 Administrarea articolelor
Pentru a menține interesul utilizatorilor, dar și pentru a-i face să se reîntoarcă indiferent dacă vor sau nu să cumpere cărți, site-ul „Cărți Și Ceai” oferă vizitatorilor săi articole din diverse categorii.
Administrarea acestor articole presupune:
– un articol poate fi adăugat oricând în baza de date cu opțiunea de a fi publicat pe site la o dată ulterioară, specificată de autorul articolului; în plus persoana care a postat articolul are posibilitatea de a menționa data până la care articolul va fi prezent pe site
– dacă un administrator sau un editor publică un articol acesta va fi aprobat imediat, însă colaboratorii au nevoie de aprobarea administratorului sau a unui editor
– sistemul permite identificarea autorilor articolelor
– administratorul poate decide cine are dreptul de a citi un anumit articol postat pe site (orice utilizator sau doar utilizatorii autentificați)
– exista mai multe categorii de articole, fiecare categorie având asociată o imagine și o scurtă descriere
– marcarea articolelor ce coincid cu locația unui anumit utilizator
– utilizatorii pot lăsa comentarii sau pot pune întrebari despre un articol, iar acestea vor fi publicate la sfârșitul articolului respectiv
– posibilitatea de afișare a numărului de vizite pentru un articol (de câte ori a fost citit acel articol); aceată informație va fi afișată cititorilor împreună cu abstractul, numele autorului și data publicării
Figura 3.7 –Tabelele aferente articolelor și legăturile dintre acestea
Datele referitoare la articole sunt stocate în baza de date în trei tabele a căror structură este prezentată în Figura 3.7. Pentru manipularea acestor date s-a folosit un set de proceduri stocate oferind posibilitatea efectuării de operații diverse: aprobare articol, ștergere articol, ștergere comentariu, ștergere categorie, numărarea articolelor, inserare articol, etc. Două exemple de astfel de proceduri sunt prezentate mai jos:
CREATE PROCEDURE dbo.csc_Articole_StergeArticol
(
@IDArticol int
)
AS
DELETE csc_Articole WHERE IDArticol = @IDArticol
CREATE PROCEDURE dbo.csc_Articole_StergeCategorie
(
@IDCategorie int
)
AS
DELETE csc_Categorii WHERE IDCategorie = @IDCategorie
În cadrul fișierului de configurare web.config sunt stabilite setările necesare pentru articole:
<CartiSiCeai>
<articole providerType="CSC.CartiSiCeai.DAL.SqlClient.SqlProviderArticole"
connectionStringName="LocalSqlServer" pageSize="10" />
</CartiSiCeai>
Aceste setări fi citite de clasa ElementArticole derivată din System.Configuration .ConfigurationElement.
Privind nivelul de acces la date există mai multe clase ce se ocupă cu prelucrarea datelor aferente articolelor derivate dintr-o clasa de bază asa cum am specificat în subcapitolul 3.2. Prelucrarea datelor presupune lucrul acestor clase cu procedurile stocate.
În cadrul nivelului de prezentare atât administratorii cât și utilizatorii obișnuiți au acces la articole printr-un set de pagini:
– ~/Admin/AdminCategorii.aspx – listează categoriile existente și permite administratorului să creeze unele noi, să șteargă sau să modifice categoriile existente
– ~/Admin/AdminArticole.aspx – listează articolele curente (pe mai multe pagini dacă este cazul) și oferă administratorul opțiunea de ștergere
– ~/Admin/AdEditArticol.aspx – permite administratorului să creeze articole noi și să le modifice pe cele existente
– ~/ArataCategorii.aspx – listează pentru utilizatorii obișnuiți toate categoriile cu numele, titlul, imaginea și descrierea acestora
– ~/BrowseArticole.aspx – permite utilizatorilor obișnuiți să navigheze printre articolele publicate într-o anumită categorie; pagina arată titlul, abstractul, locația, media voturilor și data publicării articolului.
– ~/ArataArticol.aspx – arată articolul complet cu toate comentariile aferente
Pentru uploadarea de fișiere pe site s-a folosit un control de utilizator denumit UploadFisier.ascx
Figura 3.8 – Controlul UploadFisier.ascx
3.6 Chestionare
O formă de a afla părerea utilizatorilor despre un anumit subiect este chestionarul. Facilitățile ce s-au implementat cu referire la chestionare pentru site-ul „Cărți Și Ceai” sunt următoarele:
– schimbarea chestionarului curent și adăugarea/ștergerea de noi întrebări prin intermediul unei interfețe ușor de administrat
– un control de utilizator pentru afișarea chestionarului ( întrebările și opțiunile de răspuns aferente); fiecare chestionar este identificat printr-un ID unic
– împiedicarea utilizatorilor să răspundă la același chestionar de mai multe ori
– posibilitatea de arhivare a chestionarului și vizualizarea tuturor chestionarelor arhivate în modul read-only
– utilizatorul poate vedea rezultatele voturilor de abia după ce a răspuns la chestionar, nefiind astfel influențat
Cea mai simplă metodă de a împiedica un utilizator să răspundă de mai multe ori pentru același chestionar se face prin intermediul unui cookie în browserul utilizatorului. Acest cookie reține ID-ul chestionarului pe care utilizatorul l-a votat. În momentul în care site-ul este vizitat din nou se verifică dacă există un cookie care să se potrivească cu ID-ul chestionarului. Dacă există, utilizatorului nu îi mai este permis să răspundă la acel chestionar.
Dezavantajul acestei metode este că utilizatorul poate foarte ușor să oprească verificarea cookie-urilor și să voteze de mai multe ori. Alte metode folosite sunt blocarea voturilor multiple prin identificarea IP-ului utilizatorului sau a numelui de utilizator. Site-ul „Cărți Și Ceai” folosește atât cookie-urile cât și identificarea prin IP.
Pentru stocarea datelor referitoare la chestionare sunt necesare două tabele cu următoarea structură:
Figura 3.9 – Tabelele aferente chestionarelor cu legăturile dintre ele
Procedurile stocate pentru chestionare fac referire la:
– inserarea unui nou chestionar
– modificarea unui chestionar existent
– ștergerea unui anumit chestionar după ID
– arhivarea unui anumit chestionar după ID
– inserarea opțiunilor de răspuns pentru un anumit chestionar
– ștergerea unei opțiuni de răspuns
– modificarea unei opțiuni de răspuns
Modulul ce ține de chestionare necesită un număr de setări specifice precum activarea/dezactivarea voturilor multiple, chestionarele arhivate să fie publice pentru orice utilizator precizate în fișierul de configurare web.config astfel:
<chestionare archiveIsPublic="true" votingLockByIP="false" />
Pe lângă aceste setări mai sunt cele pentru stringul de conectare la baza de date, ce clasă furnizoare va fi folosită la nivelul de acces la date, s.a.md. Setările vor fi preluate de clasa ElementChestionare derivată din System.Configuration .ConfigurationElement. al cărui cod integral este prezentat în Anexa 1.
La nivelul de prezentare administrarea chestionarelor se face prin intermediul paginii AdminChest.aspx, din directorul Admin ca în Figura 3.10.
Figura 3.10 – Pagina AdminChest.aspx
3.7 Newsletter
Site-ul „Cărți Și Ceai” dispune de facilitatea de a trimite utilizatorilor săi email-uri cu informații privind cele mai noi articole publicate pe site sau cărți nou apărute. Newsletter-ul este disponibil doar pentru utilizatorii înregistrați ce au specificat că doresc să primească email-uri cu informații.
Namespace-ul System.Net.Mail conține toate clasele necesare pentru trimiterea de email-uri. Două clase importante sunt MailMessage ce reprezintă un mesaj și clasa SmtpClient ce oferă metode pentru trimiterea unui mesaj prin conectare la un server SMTP.
Prin intermediul paginii TrimNewsletter.aspx un utilizator cu rol de editor sau administrator poate crea și trimite un newsletter. Există două posibilități de trimitere a unui newsletter: ca text simplu sau ca HTML. Utilizatorii vor primi varianta aleasă la înregistrare.
Figura 3.11 – Pagina TrimNewsletter.aspx
Odată ce administratorul sau editorul a completat acest formular va apăsa pe butonul de trimitere newsletter, eveniment descris în codul de mai jos:
protected void btnTrim_Click(object sender, EventArgs e)
{
bool trimite = false;
Newsletter.Lock.AcquireReaderLock(Timeout.Infinite);
trimite = Newsletter.IsSending;
Newsletter.Lock.ReleaseReaderLock();
// daca alt newsletter este trimis arata panoul cu mesajul de //asteptare
if (isSending)
{
panWait.Visible = true;
}
else
{
int id = Newsletter.SendNewsletter(txtSubiect.Text,
txtPlainTextBody.Text, txtHtmlBody.Value);
this.Response.Redirect("TrimiteNewsletter.aspx");
}
}
Pagina NewslettereArhivate.aspx utilizează un control de tip GridView pentru a lista newsletterle arhivate.Acest control afișează subiectul, data newsletterului și optiunea de ștergere (opțiune disponibilă doar administratorilor și editorilor).
Figura 3.12 – Pagina NewslettereArhivate.aspx
Datele referitoare la newsletter sunt stocate în baza de date într-o singură tabelă ce are următoarea structură:
Figura 3.13 – Tabela aferentă newsletterelor
3.8 Forum
Utilizatorii de Internet își doresc de cele mai multe ori să facă parte dintr-o comunitate cu interese comune. Site-ul „Cărți Și Ceai” oferă prin forum, vizitatorilor săi un cadru unde pot discuta despre subiectele lor favorite, pot pune întrbări sau pot răspunde întrebărilor altor utilizatori.
Pentru forum se implementează următoarele facilități:
– suport pentru categorii multiple sau subforumuri
– moderarea unui anumit forum; când un forum este moderat toate mesajele postate de utilizatori obișnuiți nu sunt vizibile imediat ci doar după ce sunt aprobate de un moderator, administrator sau de un editor
– lista subiectelor unui forum apare pe mai multe pagini și poate fi sortată în funcție de data publicării sau de numărul de răspunsuri fie ascendent fie descendent
– posibilitatea închiderii unui subiect din forum – nu se mai permit replici la acel subiect
Datele referitoare la forum sunt stocate în baza de date, în două tabele cu următoarea structură:
Figura 3.14 – Tabela aferentă forumului
Pagina AdEditPostare.aspx ce permite moderatorului, admistratorului sau editorului să adauge sau să modifice o postare în cadrul unui forum, are o interfață simplă prezentată în figura de mai jos:
Figura 3.15 – Pagina AdEditPostare.aspx
AdminPostariNeaprobate.aspx permite moderatorului să vizualizeze lista mesajelor ce necesită aprobare. Moderatorul poate aproba sau sterge aceste postări în funcție de conținutul lor.
Figura 3.16 – Pagina AdminPostariNeaprobate.aspx
Pagina BrowseTopicuri.aspx afișează prin intermediul unui control de tip GridView lista topicurilor dintr-un anumit forum.
Figura 3.17 – Pagina BrowseTopicuri.aspx
3.9 Magazin electronic
Nelipsit ditr-o afacere de acest gen, magazinul electronic este piesa principală din site-ul „Cărți Și Ceai”. Sunt implementate următoarele funcșionalități:
– suport pentru categorii variate de cărți; în acest mod o carte este regăsită ușor de utilizator
– fiecare carte are asociată o descriere și două imagini (una în varianta de dimensiuni reduse și imaginea mare)
– dacă este nevoie o carte va avea un procent de reducere, pe care administratorul magazinului online îl va seta într-un anumit moment oarecare
– posibilitatea de a vedea câte cărți există în stoc, iar această valoare va scădea de fiecare dată când are loc o achiziție
– administratorul magazinului online poate cu ușurință să adauge sau să șteargă o carte din magazin
– conținutul coșului de cumpărături precum și totalul de plată va fi vizibil din orice pagină a site-ului
– pentru a putea comanda un utilizator va trebui să fie autentificat
– conținutul coșului de cumpărături se va păstra, în cazul în care utilizatorul nu a făcut comanda, până la comandarea cărților sau la anularea comenzii
– administratorii magazinului online pot vizualiza toate comenzile făcute până la un moment dat, precum și posibilitatea gestionării acestora
Alegere unei soluții de plată online este foarte importantă, însă pentru atragerea cât mai multor clienți un site ar trebui să implementeze multiple soluții de plată.
În cadrul site-ului „Cărți Și Ceai” s-a optat pentru PayPal ca modalitate de plată, astfel că după ce utilizatorul autentificat comandă un produs, este redirectat către paginile PayPal. Odată efectuată tranzacția clientul se întoarce pe site.
Magazinul electronic utilizează șase tabele din baza de date pentru stocarea datelor din catalogul de cărți dar și pentru administrarea comenzilor așa cum este ilustrat în Figura 3.18.
î
Figura 3.18 – Tabelele aferente magazinului electronic
Setările de configurare pentru magazinul electronic sunt definite în fișierul de configurare web.config.
<magazin sandboxMode="true" businessEmail="[anonimizat]" />
Nivelul interfeței cu utilizatorul cuprinde numeroase pagini, dintre care:
– ~/Admin/AdminMetodeTransport.aspx – permite unui administrator de magazin să adauge, modifice sau să șteargă o metodă de transport
– ~/Admin/AdminCategCarti.aspx – permite unui administrator de magazin să adauge, modifice sau să șteargă o categorie
– ~/Admin/AdminStatusComenzi.aspx – permite unui administrator de magazin să adauge, modifice sau să șteargă statusul comenzilor
– ~/Admin/AdEditCarte.aspx – permite unui administrator de magazin să adauge, modifice sau să șteargă o carte din catalog
– ~/Admin/AdminCarti.aspx – permite unui adminstrator de magazin să vizualizeze lista cărților disponibile cu prețurile și descrierea aferentă acestora
– ~/Admin/AdminComenzi.aspx – permite unui administrator de magazin să gestioneze comenzile existente la un moment dat
– ~/Admin/EditComenzi.aspx – permite unui administrator de magazin să vizualizeze o anumită comandă și să editeze anumite atribute
– ~/ArataCategorii.aspx – permite unui utilizator să vizualizeze toate categoriile de cărți disponibile
– ~/BrowseCarți.aspx – permite unui utilizator să vizualizeze cărțile existente într-o anumită categorie precum și detalii despre acestea
– ~/ArataCarte.aspx – permite unui utilizator să vadă detaliile aferente unei cărți
– ~/CosCumparaturi.aspx – arată conținutul coșului de cumpărături pe care utilizatorul poate să îl modifice în funcție de preferințe.
3.10 Încărcarea site-ului pe server
Ultima etapă în dezvoltarea aplicației, după ce a fost testată local, o reprezintă publicarea site-ului. Această etapă se împarte la rândul ei în doi pași:
– încărcărea bazei de date pe server
– încărcărea fișierelor aferente site-ului
În cadrul produsului software Visual Web Developer 2005 dispunem de facilitatea „Copy Web Site” ce ușurează enorm de mult munca programatorului în încercarea de a copia fișierele pe un server. (Figura 3.15)
Figura 3.15 – Utilitatea „Copy Web Site”
Fișierele pot fi copiate pe serverul local IIS sau pe un server aflat la distanță. Înainte de a copia baza de date trebuie selectată opțiunea „Detach”.
Site-ul „Cărți Și Ceai” poate fi vizitat la adresa http://www.aliajarjis.qsh.es/
Concluzii
Nevoia tot mai mare de produse și servicii a determinat ca modul de prezentare si comercializare al acestora să devină cel mai important factor în dezvoltarea unei afaceri, iar amploarea remarcabilă pe care a cunoscut-o Internetul nu a fost deloc neglijată.
În acest sens această lucrare a încercat să surprindă situația actuala a afacerilor electronice, căile pe care acesta tinde sa se dezvolte, răspunzând la unele întrebari, cum ar fi următoarele:
Ce reprezintă o afacere electronică?
Ce modele de afaceri electronice există?
Care este situația afacerilor electronice din România?
Ce sisteme de plati sunt disponibile pe Internet?
Exista deosebiri între procesatorii de carduri bancare externi si cei autohtoni?
De asemenea s-a ținut cont și despre modalitățile de implementare a unei afaceri electronice, discutând despre tehnologia ASP.NET și limbajul XML.
În capitolul 3 al acestei lucrări s-a descris implementarea unei afaceri electronice de tip B2C cu următoarele funcționalități:
– posibilitatea de înregistrare a utilizatorilor pentru a putea participa cu mesaje în forum, pentru a avea acces la newslettere, pentru a putea comanda cărți din magazinul electronic, devenind membrii ai site-ului.
– magazin online prin care se pot comanda produse de pe site, dar se efectuează și administrarea comenzilor, totul printr-o interfață intuitivă
– forum un cadru unde membrii site-ului pot discuta despre subiectele lor favorite, pot pune întrbări sau pot răspunde întrebărilor altor utilizatori.
– newsletter facilitatea de a trimite utilizatorilor săi înregistrați email-uri cu informații privind cele mai noi articole publicate pe site sau cărți nou apărute
– chestionare ce reprezintă o formă de comunicare cu utilizatorii, pentru a afla părerea lor despre un anumit subiect
– articole pentru a menține interesul utilizatorilor, dar și pentru a-i face să se reîntoarcă indiferent dacă vor sau nu să cumpere cărți
Dezvoltări ulterioare pot fi făcute în mai multe direcții. Printre acestea ar fi și posibilitatea folosirii de feed-uri web (RSS) sau oferirea posibilității administratorului să configureze interfața site-ului.
Bibliografie
*** Journal of Marketing Theory and Practice, volumul 14, nr. 4, toamnă 2006- Factors influencing consumer choice of a “rating web site”: an experimental investigation of an online interactive decision aid, ABI/INFORM Global
Armstrong D. – Pro ASP.NET 2.0 Website Programming, Apress 2005
Barton M. – An Approach to Advertising on the Internet
Bellinaso, M. – ASP.NET 2.0 Website Programming: Problem – Design – Solution (Programmer to Programmer), Wrox Press 2006
Năstase F, Năstase P – Tehnologia aplicațiilor web XML-DOM-ASP, Ed. Economică, București 2002
Năstase F, Timofte C -Tehnologia afacerilor pe Internet, Ed. ASE, București, 2004
Năstase F – Foile de stil în paginile Web, Revista “Informatica Economică”, nr. 1, pag. 32-40, 2002
T. Surcel, R. Marsanu, P. Pocatilu, A. Reveiu, F. Alecu, R. Bologa – Tehnologii Web și Baze de date, Editura Tribuna Economica, București 2002
http://code.msdn.microsoft.com/
http://www.learnasp.com/freebook/learn
http://www.ecursuri.ro/
http://msconline.maconstate.edu/tutorials/aspnet20/default.htm
http://www.asp.net/
http://www.elvensoft.ro/techs_aspNET.aspx
http://www.technorati.ro/node/91517
http://www.codeproject.com/
Anexa 1
Fișierul Web.config
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<configSections>
<section name="CartiSiCeai" type="CSC.CartiSiCeai.SectiuneCartiSiCeai, __code"/>
</configSections>
<CartiSiCeai defaultConnectionStringName="LocalSqlServer">
<contactForm mailTo="[anonimizat]"/>
<articole pageSize="10" />
<chestionare archiveIsPublic="true" votingLockByIP="false" />
<newslettere fromEmail="[anonimizat]" fromDisplayName="CartiSiCeai" />
<forums threadsPageSize="8" hotThreadPosts="10" bronzePosterPosts="10" silverPosterPosts="20" goldPosterPosts="50" />
<magazin sandboxMode="true" businessEmail="[anonimizat]" />
</CartiSiCeai>
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer" connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;Database=aliajarjis.qsh.es_b10f0662-b5c0-4574-850e-99f972adfd63;AttachDBFilename=|DataDirectory|ASPNETDB.MDF" />
</connectionStrings>
<system.web>
<authentication mode="Forms">
<forms cookieless="AutoDetect" loginUrl="~/AccesRespins.aspx" name="CSCFORMAUTH"/>
</authentication>
<pagini theme="NaturalGreen" masterPageFile="~/Template.master" maintainScrollPositionOnPostBack="true"></pagini>
<compilation debug="true">
<assemblies>
<add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<membership defaultProvider="CSC_MembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<add name="CSC_MembershipProvider" connectionStringName="LocalSqlServer" applicationName="/" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="true" passwordFormat="Encrypted" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" minRequiredPasswordLength="5" minRequiredNonalphanumericCharacters="0" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</membership>
<siteMap defaultProvider="CSC_SiteMapProvider" enabled="true">
<providers>
<add name="CSC_SiteMapProvider" type="System.Web.XmlSiteMapProvider" securityTrimmingEnabled="true" siteMapFile="web.sitemap"/>
</providers>
</siteMap>
<sessionState cookieless="AutoDetect"/>
<roleManager enabled="true" cacheRolesInCookie="true" cookieName="CSCROLES" defaultProvider="CSC_RoleProvider">
<providers>
<add connectionStringName="LocalSqlServer" applicationName="/" name="CSC_RoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
<anonymousIdentification cookieless="AutoDetect" enabled="true"/>
<profile defaultProvider="CSC_ProfileProvider">
<providers>
<add name="CSC_ProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
<properties>
<add name="Prenume" type="String" />
<add name="Nume" type="String" />
<add name="Sex" type="String" />
<add name="DataNasterii" type="DateTime" />
<add name="Ocupatie" type="String" />
<add name="Site" type="String" />
<add name="CosCumparaturi" type="CSC.CartiSiCeai.BLL.Magazin.CosDeCumparaturi" serializeAs="Binary" allowAnonymous="true" />
<group name="Forum">
<add name="Postari" type="Int32" />
<add name="UrlAvatar" type="String" />
</group>
<group name="Adresa">
<add name="Strada" type="String" />
<add name="CodPostal" type="String" />
<add name="Oras" type="String" />
<add name="Stat" type="String" />
<add name="Tara" type="String" />
</group>
<group name="DateContact">
<add name="Telefon" type="String" />
<add name="Fax" type="String" />
</group>
<group name="Preferinte">
<add name="Teme" type="String" allowAnonymous="true" />
<add name="Newsletter" type="CSC.CartiSiCeai.BLL.Newslettere.SubscriptionType" />
</group>
</properties>
</profile>
<machineKey validationKey="AutoGenerate"
decryptionKey="AutoGenerate" validation="SHA1"/>
</system.web>
<location path="EditProfil.aspx">
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</location>
<location path="IstorieComenzi.aspx">
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</location>
<location path="AdEditPost.aspx">
<system.web>
<authorization>
<allow roles="Administratori,Editori,Moderatori,Postatori"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<system.net>
<mailSettings>
<smtp deliveryMethod="Network">
<network host="smtp.gmail.com" password="" userName="" />
</smtp>
</mailSettings>
</system.net>
</configuration>
Fișierul Web.sitemap
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" enableLocalization="true" >
<siteMapNode title="Acasa" url="~/Default.aspx">
<siteMapNode title="Articole" url="~/ArataCategorii.aspx">
<siteMapNode title="Browse_Articole" url="~/BrowseArticole.aspx">
<siteMapNode title="Articol" url="~/ArataArticol.aspx" />
</siteMapNode>
</siteMapNode>
<siteMapNode title="Magazin" url="~/ArataCategCarti.aspx">
<siteMapNode title="CosDeCumparaturi" url="~/CosCumparaturi.aspx" />
<siteMapNode title="IstorieComenzi" url="~/IstorieComenzi.aspx" />
<siteMapNode title="ComenziAnulate" url="~/PayPal/OrderCancelled.aspx" />
<siteMapNode title="ComenziSalvate" url="~/PayPal/OrderCompleted.aspx" />
<siteMapNode title="Browse_Carti" url="~/BrowseCarti.aspx">
<siteMapNode title="Carte" url="~/ArataCarte.aspx" />
</siteMapNode>
</siteMapNode>
<siteMapNode title="Forum" url="~/ArataForum.aspx">
<siteMapNode title="Subiect" url="~/ArataTopic.aspx" />
</siteMapNode>
<siteMapNode title="Despre" url="~/Despre.aspx" />
<siteMapNode title="Contact" url="~/Contact.aspx" />
<siteMapNode title="Admin" url="~/Admin/Default.aspx" roles="Administrators,Editors,Contributors">
<siteMapNode title="Admin_Useri" url="~/Admin/AdminUseri.aspx" >
<siteMapNode title="Edit_User" url="~/Admin/EditUser.aspx" />
</siteMapNode>
<siteMapNode title="Admin_Articole" url="~/Admin/AdminArticole.aspx" >
<siteMapNode title="Adauga_Editeaza_Articol" url="~/Admin/AdEditArticol.aspx" />
<siteMapNode title="Categorii" url="~/Admin/AdminCategorii.aspx" />
<siteMapNode title="Comentarii" url="~/Admin/AdminComentarii.aspx" />
</siteMapNode>
<siteMapNode title="Admin_Carti" url="~/Admin/AdminCarti.aspx" >
<siteMapNode title="Adauga_Edit_Carte" url="~/Admin/AdEditCarte.aspx" />
<siteMapNode title="CategoriiCarti" url="~/Admin/AdminCategCarti.aspx" />
<siteMapNode title="StatusComanda" url="~/Admin/AdminStatusComenzi.aspx" />
<siteMapNode title="MetodaTransport" url="~/Admin/AdminMetodaTransp.aspx" />
</siteMapNode>
<siteMapNode title="Admin_Comenzi" url="~/Admin/AdminComenzi.aspx" >
<siteMapNode title="Edit_Comenzi" url="~/Admin/EditComanda.aspx" />
</siteMapNode>
<siteMapNode title="Admin_Forum" url="~/Admin/AdminForum.aspx" >
<siteMapNode title="Aproba_Postari" url="~/Admin/AdminPosturiNeaprobate.aspx" />
</siteMapNode>
<siteMapNode title="Admin_Chestionare" url="~/Admin/AdminChest.aspx" />
<siteMapNode title="Trim_Newsletter" url="~/Admin/TrimNewsletter.aspx" />
<siteMapNode title="Trimite_Newsletter" url="~/Admin/TrimiteNewsletter.aspx" />
</siteMapNode>
</siteMapNode>
</siteMap>
Template.master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Template.master.cs"
Inherits="Template" %>
<%@ Register Src="Controls/SelectorTeme.ascx" TagName="SelectorTeme"
TagPrefix="mb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Titlul" runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Carti Si Ceai</title>
</head>
<body>
<form id="FormaPrincipala" runat="server">
<div id="antet">
<div id="antet2">
<div id="meniuantet">
<asp:SiteMapDataSource ID="SiteMapDataSource1"
runat="server" StartingNodeOffset="0" />
<asp:Menu ID="meniuAntet" runat="server"
CssClass="antetmeniulink"
DataSourceID="SiteMapDataSource1"
Orientation="Horizontal"
MaximumDynamicDisplayLevels="0"
SkipLinkText=""
StaticDisplayLevels="2" />
</div>
</div>
<div id="loginbox"><asp:LoginView ID="LoginView1" runat="server">
<AnonymousTemplate>
<asp:Login ID="Login" runat="server" Width="100%"
FailureAction="RedirectToLoginPage">
<LayoutTemplate>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="60px">Nume:</td>
<td><asp:TextBox id="UserName" runat="server" Width="95%" /></td>
<td width="5px" align="right">
<asp:RequiredFieldValidator ID="valRequireUserName"
runat="server" SetFocusOnError="true" Text="*"
ControlToValidate="UserName" ValidationGroup="Login" />
</td>
</tr>
<tr>
<td>Parola:</td>
<td><asp:TextBox ID="Password" runat="server"
TextMode="Password" Width="95%" /></td>
<td width="5px" align="right">
<asp:RequiredFieldValidator ID="valRequirePassword"
runat="server" SetFocusOnError="true" Text="*"
ControlToValidate="Password" ValidationGroup="Login" />
</td>
</tr>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td><asp:CheckBox ID="RememberMe" runat="server"
Text="Tine-ma minte"></asp:Checkbox></td>
<td align="right">
<asp:ImageButton ID="Submit" runat="server" CommandName="Login"
ImageUrl="~/imagini/go.gif"
ValidationGroup="Login" />
</td>
<td width="5px" align="right"> </td>
</tr>
</table>
<div style="border-top: solid 1px black; margin-top: 2px">
<asp:HyperLink ID="lnkRegister" runat="server"
NavigateUrl="~/Inregistrare.aspx">Creaza un nou cont
</asp:HyperLink><br />
<asp:HyperLink ID="lnkPasswordRecovery" runat="server"
NavigateUrl="~/RecuperareParola.aspx">Mi-am uitat parola
</asp:HyperLink>
</div>
</LayoutTemplate>
</asp:Login>
</AnonymousTemplate>
<LoggedInTemplate>
<div id="welcomebox">
<asp:LoginName ID="LoginName1" runat="server"
FormatString="Bine ai venit {0}!" /><br />
<small>
<font face="Webdings">4</font>
<asp:HyperLink ID="lnkProfile" runat="server" Text="Editeaza profil"
NavigateUrl="~/EditProfile.aspx" />
<font face="Webdings">3</font><br />
<font face="Webdings">4</font>
<asp:LoginStatus ID="LoginStatus1" Runat="server" />
<font face="Webdings">3</font>
</small>
</div>
</LoggedInTemplate>
</asp:LoginView>
</div>
<div id="selectorteme">
<mb:SelectorTeme id="SelectorTeme" runat="server"/>
</div>
</div>
<div id="container">
<div id="container2">
<div id="coldreapta">
<div class="text">Ceva text…</div>
<asp:ContentPlaceHolder ID="ContinutDreapta" runat="server" />
</div>
<div id="colcentru">
<div id="indiciu">
<asp:SiteMapPath ID="SiteMapPath1" runat="server" />
</div>
<div id="continutcolcentru">
<asp:ContentPlaceHolder ID="ContinutPrincipal" runat="server">
<p> </p><p> </p><p> </p><p> </p>
<p> </p><p> </p><p> </p><p> </p>
</asp:ContentPlaceHolder>
</div>
</div>
</div>
<div id="colstanga">
<div class="sectiunetitlu">
<asp:Image ID="imgSageata1" runat="server"
ImageUrl="~/imagini/sageatar.gif"
ImageAlign="left" hspace="6" />Stiri Site
</div>
<div class="text"><b>20 Iulie 2008 :: Antet Stiri</b><br />
Textul stirilor…
</div>
<div class="textalternativ" style="text-align:justify; background-color: #DEF068; padding: 6px 6px 6px 6px;"><b>20 Iulie 2008 :: Antet Stiri</b><br />
Alte stiri…
</div>
<asp:ContentPlaceHolder ID="ContinutStanga" runat="server" />
<div id="casutabanner">
<a href="http://www.google.com" target="_blank">
Nenumarate multumiri pentru Google
care mi-a fost alaturi si la bine si la rau<br /><br />
<asp:Image runat="server" ID="BannerTemplateMonster"
ImageUrl="~/imagini/google.jpeg" Width="100px" />
</a>
</div>
</div>
</div>
<div id="subsol">
<div id="subsolmeniu">
<asp:Menu ID="mnuSubsol" runat="server"
style="margin-left:auto; margin-right:auto;"
CssClass="subsolmeniulink"
DataSourceID="SiteMapDataSource1"
Orientation="Horizontal"
MaximumDynamicDisplayLevels="0"
SkipLinkText=""
StaticDisplayLevels="2" />
</div>
<div id="textsubsol">
<small>
Copyright © 2008 Alia Jarjis
</small>
</div>
</div>
</form>
</body>
</html>
ConfigSection.cs
public class SectiuneCartiSiCeai : ConfigurationSection
{
[ConfigurationProperty("defaultConnectionStringName", DefaultValue = "LocalSqlServer")]
public string DefaultConnectionStringName
{
get { return (string)base["defaultConnectionStringName"]; }
set { base["connectionStdefaultConnectionStringNameringName"] = value; }
}
[ConfigurationProperty("defaultCacheDuration", DefaultValue = "600")]
public int DefaultCacheDuration
{
get { return (int)base["defaultCacheDuration"]; }
set { base["defaultCacheDuration"] = value; }
}
[ConfigurationProperty("contactForm", IsRequired=true)]
public ContactFormElement ContactForm
{
get { return (ContactFormElement) base["contactForm"]; }
}
[ConfigurationProperty("articole", IsRequired = true)]
public ElementArticole Articole
{
get { return (ElementArticole)base["articole"]; }
}
[ConfigurationProperty("chestionare", IsRequired = true)]
public PollsElement Polls
{
get { return (PollsElement)base["chestionare"]; }
}
[ConfigurationProperty("newslettere", IsRequired = true)]
public NewsletterElement Newslettere
{
get { return (NewsletterElement)base["newslettere"]; }
}
[ConfigurationProperty("forum", IsRequired = true)]
public ForumElement Forum
{
get { return (ForumElement)base["forum"]; }
}
[ConfigurationProperty("magazin", IsRequired = true)]
public MagazinElement Magazin
{
get { return (MagazinElement)base["magazin"]; }
}
}
public class ContactFormElement : ConfigurationElement
{
[ConfigurationProperty("mailSubject",
DefaultValue = "Mail from Carti si Ceai: {0}")]
public string MailSubject
{
get { return (string)base["mailSubject"]; }
set { base["mailSubject"] = value; }
}
[ConfigurationProperty("mailTo", IsRequired = true)]
public string MailTo
{
get { return (string)base["mailTo"]; }
set { base["mailTo"] = value; }
}
[ConfigurationProperty("mailCC")]
public string MailCC
{
get { return (string)base["mailCC"]; }
set { base["mailCC"] = value; }
}
}
public class ElementArticole : ConfigurationElement
{
[ConfigurationProperty("connectionStringName")]
public string ConnectionStringName
{
get { return (string)base["connectionStringName"]; }
set { base["connectionStringName"] = value; }
}
public string ConnectionString
{
get
{
string connStringName = (string.IsNullOrEmpty(this.ConnectionStringName) ?
Globals.Settings.DefaultConnectionStringName : this.ConnectionStringName );
return WebConfigurationManager.ConnectionStrings[connStringName].ConnectionString;
}
}
[ConfigurationProperty("providerType", DefaultValue = "CSC.CartiSiCeai.DAL.SqlClient.SqlArticoleProvider")]
public string ProviderType
{
get { return (string)base["providerType"]; }
set { base["providerType"] = value; }
}
[ConfigurationProperty("ratingLockInterval", DefaultValue = "15")]
public int RatingLockInterval
{
get { return (int)base["ratingLockInterval"]; }
set { base["ratingLockInterval"] = value; }
}
[ConfigurationProperty("pageSize", DefaultValue = "10")]
public int PageSize
{
get { return (int)base["pageSize"]; }
set { base["pageSize"] = value; }
}
[ConfigurationProperty("enableCaching", DefaultValue = "true")]
public bool EnableCaching
{
get { return (bool)base["enableCaching"]; }
set { base["enableCaching"] = value; }
}
[ConfigurationProperty("cacheDuration")]
public int CacheDuration
{
get
{
int duration = (int)base["cacheDuration"];
return (duration > 0 ? duration : Globals.Settings.DefaultCacheDuration);
}
set { base["cacheDuration"] = value; }
}
}
public class ChestionarElement : ConfigurationElement
{
[ConfigurationProperty("connectionStringName")]
public string ConnectionStringName
{
get { return (string)base["connectionStringName"]; }
set { base["connectionStringName"] = value; }
}
public string ConnectionString
{
get
{
string connStringName = (string.IsNullOrEmpty(this.ConnectionStringName) ?
Globals.Settings.DefaultConnectionStringName : this.ConnectionStringName);
return WebConfigurationManager.ConnectionStrings[connStringName].ConnectionString;
}
}
[ConfigurationProperty("providerType", DefaultValue = "CSC.CartiSiCeai.DAL.SqlClient.SqlChestProvider")]
public string ProviderType
{
get { return (string)base["providerType"]; }
set { base["providerType"] = value; }
}
[ConfigurationProperty("votingLockInterval", DefaultValue = "15")]
public int VotingLockInterval
{
get { return (int)base["votingLockInterval"]; }
set { base["votingLockInterval"] = value; }
}
[ConfigurationProperty("votingLockByCookie", DefaultValue = "true")]
public bool VotingLockByCookie
{
get { return (bool)base["votingLockByCookie"]; }
set { base["votingLockByCookie"] = value; }
}
[ConfigurationProperty("votingLockByIP", DefaultValue = "true")]
public bool VotingLockByIP
{
get { return (bool)base["votingLockByIP"]; }
set { base["votingLockByIP"] = value; }
}
[ConfigurationProperty("archiveIsPublic", DefaultValue = "false")]
public bool ArchiveIsPublic
{
get { return (bool)base["archiveIsPublic"]; }
set { base["archiveIsPublic"] = value; }
}
[ConfigurationProperty("enableCaching", DefaultValue = "true")]
public bool EnableCaching
{
get { return (bool)base["enableCaching"]; }
set { base["enableCaching"] = value; }
}
[ConfigurationProperty("cacheDuration")]
public int CacheDuration
{
get
{
int duration = (int)base["cacheDuration"];
return (duration > 0 ? duration : Globals.Settings.DefaultCacheDuration);
}
set { base["cacheDuration"] = value; }
}
}
public class NewsletterElement : ConfigurationElement
{
[ConfigurationProperty("connectionStringName")]
public string ConnectionStringName
{
get { return (string)base["connectionStringName"]; }
set { base["connectionStringName"] = value; }
}
public string ConnectionString
{
get
{
string connStringName = (string.IsNullOrEmpty(this.ConnectionStringName) ?
Globals.Settings.DefaultConnectionStringName : this.ConnectionStringName);
return WebConfigurationManager.ConnectionStrings[connStringName].ConnectionString;
}
}
[ConfigurationProperty("providerType", DefaultValue = "CSC.CartiSiCeai.DAL.SqlClient.SqlNewsletterProvider")]
public string ProviderType
{
get { return (string)base["providerType"]; }
set { base["providerType"] = value; }
}
[ConfigurationProperty("fromEmail", IsRequired=true)]
public string FromEmail
{
get { return (string)base["fromEmail"]; }
set { base["fromEmail"] = value; }
}
[ConfigurationProperty("fromDisplayName", IsRequired = true)]
public string FromDisplayName
{
get { return (string)base["fromDisplayName"]; }
set { base["fromDisplayName"] = value; }
}
[ConfigurationProperty("hideFromArchiveInterval", DefaultValue = "15")]
public int HideFromArchiveInterval
{
get { return (int)base["hideFromArchiveInterval"]; }
set { base["hideFromArchiveInterval"] = value; }
}
[ConfigurationProperty("archiveIsPublic", DefaultValue = "false")]
public bool ArchiveIsPublic
{
get { return (bool)base["archiveIsPublic"]; }
set { base["archiveIsPublic"] = value; }
}
[ConfigurationProperty("enableCaching", DefaultValue = "true")]
public bool EnableCaching
{
get { return (bool)base["enableCaching"]; }
set { base["enableCaching"] = value; }
}
[ConfigurationProperty("cacheDuration")]
public int CacheDuration
{
get
{
int duration = (int)base["cacheDuration"];
return (duration > 0 ? duration : Globals.Settings.DefaultCacheDuration);
}
set { base["cacheDuration"] = value; }
}
}
public class ForumElement : ConfigurationElement
{
[ConfigurationProperty("connectionStringName")]
public string ConnectionStringName
{
get { return (string)base["connectionStringName"]; }
set { base["connectionStringName"] = value; }
}
public string ConnectionString
{
get
{
string connStringName = (string.IsNullOrEmpty(this.ConnectionStringName) ?
Globals.Settings.DefaultConnectionStringName : this.ConnectionStringName);
return WebConfigurationManager.ConnectionStrings[connStringName].ConnectionString;
}
}
[ConfigurationProperty("providerType", DefaultValue = "CSC.CartiSiCeai.DAL.SqlClient.SqlForumProvider")]
public string ProviderType
{
get { return (string)base["providerType"]; }
set { base["providerType"] = value; }
}
[ConfigurationProperty("threadsPageSize", DefaultValue = "25")]
public int ThreadsPageSize
{
get { return (int)base["threadsPageSize"]; }
set { base["threadsPageSize"] = value; }
}
[ConfigurationProperty("postsPageSize", DefaultValue = "10")]
public int PostsPageSize
{
get { return (int)base["postsPageSize"]; }
set { base["postsPageSize"] = value; }
}
[ConfigurationProperty("hotThreadPosts", DefaultValue = "25")]
public int HotThreadPosts
{
get { return (int)base["hotThreadPosts"]; }
set { base["hotThreadPosts"] = value; }
}
[ConfigurationProperty("bronzePosterPosts", DefaultValue = "100")]
public int BronzePosterPosts
{
get { return (int)base["bronzePosterPosts"]; }
set { base["bronzePosterPosts"] = value; }
}
[ConfigurationProperty("bronzePosterDescription", DefaultValue = "Bronze Poster")]
public string BronzePosterDescription
{
get { return (string)base["bronzePosterDescription"]; }
set { base["bronzePosterDescription"] = value; }
}
[ConfigurationProperty("silverPosterPosts", DefaultValue = "500")]
public int SilverPosterPosts
{
get { return (int)base["silverPosterPosts"]; }
set { base["silverPosterPosts"] = value; }
}
[ConfigurationProperty("silverPosterDescription", DefaultValue = "Silver Poster")]
public string SilverPosterDescription
{
get { return (string)base["silverPosterDescription"]; }
set { base["silverPosterDescription"] = value; }
}
[ConfigurationProperty("goldPosterPosts", DefaultValue = "1000")]
public int GoldPosterPosts
{
get { return (int)base["goldPosterPosts"]; }
set { base["goldPosterPosts"] = value; }
}
[ConfigurationProperty("goldPosterDescription", DefaultValue = "Gold Poster")]
public string GoldPosterDescription
{
get { return (string)base["goldPosterDescription"]; }
set { base["goldPosterDescription"] = value; }
}
[ConfigurationProperty("enableCaching", DefaultValue = "true")]
public bool EnableCaching
{
get { return (bool)base["enableCaching"]; }
set { base["enableCaching"] = value; }
}
[ConfigurationProperty("cacheDuration")]
public int CacheDuration
{
get
{
int duration = (int)base["cacheDuration"];
return (duration > 0 ? duration : Globals.Settings.DefaultCacheDuration);
}
set { base["cacheDuration"] = value; }
}
}
public class MagazinElement : ConfigurationElement
{
[ConfigurationProperty("connectionStringName")]
public string ConnectionStringName
{
get { return (string)base["connectionStringName"]; }
set { base["connectionStringName"] = value; }
}
public string ConnectionString
{
get
{
string connStringName = (string.IsNullOrEmpty(this.ConnectionStringName) ?
Globals.Settings.DefaultConnectionStringName : this.ConnectionStringName);
return WebConfigurationManager.ConnectionStrings[connStringName].ConnectionString;
}
}
[ConfigurationProperty("providerType", DefaultValue = "CSC.CartiSiCeai.DAL.SqlClient.SqlMagazinProvider")]
public string ProviderType
{
get { return (string)base["providerType"]; }
set { base["providerType"] = value; }
}
[ConfigurationProperty("ratingLockInterval", DefaultValue = "15")]
public int RatingLockInterval
{
get { return (int)base["ratingLockInterval"]; }
set { base["ratingLockInterval"] = value; }
}
[ConfigurationProperty("pageSize", DefaultValue = "10")]
public int PageSize
{
get { return (int)base["pageSize"]; }
set { base["pageSize"] = value; }
}
[ConfigurationProperty("defaultOrderListInterval", DefaultValue = "7")]
public int DefaultOrderListInterval
{
get { return (int)base["defaultOrderListInterval"]; }
set { base["defaultOrderListInterval"] = value; }
}
[ConfigurationProperty("sandboxMode", DefaultValue = "false")]
public bool SandboxMode
{
get { return (bool)base["sandboxMode"]; }
set { base["sandboxMode"] = value; }
}
[ConfigurationProperty("businessEmail", IsRequired=true)]
public string BusinessEmail
{
get { return (string)base["businessEmail"]; }
set { base["businessEmail"] = value; }
}
[ConfigurationProperty("currencyCode", DefaultValue = "RON")]
public string CurrencyCode
{
get { return (string)base["currencyCode"]; }
set { base["currencyCode"] = value; }
}
[ConfigurationProperty("lowAvailability", DefaultValue = "10")]
public int LowAvailability
{
get { return (int)base["lowAvailability"]; }
set { base["lowAvailability"] = value; }
}
[ConfigurationProperty("enableCaching", DefaultValue = "true")]
public bool EnableCaching
{
get { return (bool)base["enableCaching"]; }
set { base["enableCaching"] = value; }
}
[ConfigurationProperty("cacheDuration")]
public int CacheDuration
{
get
{
int duration = (int)base["cacheDuration"];
return (duration > 0 ? duration : Globals.Settings.DefaultCacheDuration);
}
Anexa 2
Structura bazei de date
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: Implementarea Aplicatiilor de Afaceri Prin Asp.net și Xml (ID: 149236)
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.
