ΚΕΦΑΛΑΙΟ 5

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΙΣΤΟΥ -
ΥΠΟΣΤΗΡΙΞΗ ΛΕΙΤΟΥΡΓΙΩΝ ΗΛΕΚΤΡΟΝΙΚΟΥ ΕΜΠΟΡΙΟΥ:
ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ

Χρήστος Κ. Γεωργιάδης
Αναπληρωτής Καθηγητής Πανεπιστημίου Μακεδονίας
geor@uom.edu.gr


Οκτώβριος 2015


Περιεχόμενα



Σύνοψη

Στο κεφάλαιο αυτό παρουσιάζεται ένα σύνολο εργαστηριακών ασκήσεων (εκφωνήσεις και οι υποδειγματικές λύσεις αυτών), με σκοπό την κατανόηση τεχνικών προγραμματισμού από την πλευρά του διακομιστή (server-side scripting). Η επιμέρους τεχνολογία που αξιοποιείται είναι η τεχνολογία ASP.NET (Active Server Pages), η οποία υποστηρίζεται από διακομιστές (web servers) της εταιρίας Microsoft (IIS, Internet Information Services). Στα παραδείγματα χρησιμοποιείται ως βασική γλώσσα προγραμματισμού στον Ιστό η γλώσσα C#, και συνδυάζεται η λειτουργικότητά της με στοιχεία προγραμματισμού από την πλευρά του πελάτη, με αποσπάσματα κώδικα JavaScript. Χρησιμοποιούνται επίσης αντικείμενα ADO.NET (ActiveX Data Objects) για τη σύνδεση και αλληλεπίδραση με βάσεις δεδομένων SQL.

Προαπαιτούμενη γνώση

Το κεφάλαιο 1 του παρόντος συγγράμματος, και επιπλέον θα είναι χρήσιμη κάποια προηγούμενη εμπειρία σε ζητήματα Προγραμματισμού Υπολογιστών και Βάσεων Δεδομένων.

1. Εισαγωγή

Στηριζόμενοι στα ενορατικά/οπτικά (visual) εργαλεία, στους προσφερόμενους μηχανισμούς διάδρασης, αλλά και γενικότερα στην προσφερόμενη ευχρηστία ενός ολοκληρωμένου περιβάλλοντος προγραμματισμού (όπως αυτό του Visual Studio), ακολουθούμε τη μέθοδο εκπαίδευσης από παράδειγμα (example-based learning) για να παρουσιάσουμε σημαντικές έννοιες και τεχνικές σχετικές με την ανάπτυξη εφαρμογών Ιστού και την υποστήριξη λειτουργιών ηλεκτρονικού εμπορίου, όπως: χρήση και επεξεργασία πρότυπων σελίδων (master pages), HTML tags και κανόνες μορφοποίησης CSS, δημιουργία μενού πλοήγησης, αντικειμενοστραφής και καθοδηγούμενος από συμβάντα προγραμματισμός για ανάπτυξη εφαρμογών στον Ιστό, φόρμες στον Ιστό και επικύρωση στοιχείων φόρμας, αξιοποίηση των application και session events, σύνδεση Iστότοπου με βάση δεδομένων και επεξεργασία στοιχείων βάσης δεδομένων μέσω Ιστοσελίδων, διαχείριση ζητημάτων ασφάλειας (δημιουργία ρόλων και χρηστών, εγγραφή χρηστών, αυθεντικοποίηση και έλεγχος πρόσβασης χρηστών), λειτουργία καλαθιού αγορών.

Να σημειώσουμε εδώ ότι η πολύ σημαντική πλευρά του προγραμματισμού στον Ιστό από την πλευρά του πελάτη (client-side scripting), με άξονα τις ισχυρές δυνατότητες της γλώσσας JavaScript, θα γίνει σε επόμενο κεφάλαιο που πραγματεύεται την ανάπτυξη περιεχομένου για κινητές συσκευές. Ό σημαντικότερος λόγος για την απόφασή μας αυτή, είναι η ευρεία χρήση πλέον της JavaScript για την ανάπτυξη εφαρμογών κινητού Ιστού (mobile Web), δυναμικών Ιστότοπων που γίνονται προσβάσιμοι από τους χρήστες κινητών συσκευών μέσω των φυλλομετρητών (browsers) τους.

2. Προγραμματισμός από την πλευρά του Διακομιστή - ASP.NET Τεχνολογία και Περιβάλλον Προγραμματισμού Visual Studio

2.1. Βασικοί μηχανισμοί διάδρασης (UI controls) ενός Ιστότοπου

Εκφώνηση:

Δημιουργήστε έναν Ιστότοπο με τρεις σελίδες, με μενού βασισμένο σε λέξεις-συνδέσμους που τις συνδέει (η παρακάτω εικόνα παρουσιάζει την αρχική του σελίδα). Στο κάτω μέρος της αρχικής σελίδας και της Page 2 παρέχεται η δυνατότητα να δώσει ο χρήστης το όνομά του και να λάβει απάντηση (μηχανισμοί label, textbox, button). Στις σελίδες Page1 και Page 2 να εμφανίζεται στο πάνω μέρος τους δυναμικά 'Καλημέρα!' ή 'Καλησπέρα!' (με script μέσα στον κώδικα της σελίδας)


















Εικόνα 5.1 Βασική, αρχική Ιστοσελίδα

Δημιουργήστε έναν Ιστότοπο με τρεις σελίδες, με μενού βασισμένο σε λέξεις-συνδέσμους που τις συνδέει (η παραπάνω εικόνα παρουσιάζει την αρχική του σελίδα). Στο κάτω μέρος της αρχικής σελίδας και της Page 2 παρέχεται η δυνατότητα να δώσει ο χρήστης το όνομά του και να λάβει απάντηση (μηχανισμοί label, textbox, button). Στις σελίδες Page1 και Page 2 να εμφανίζεται στο πάνω μέρος τους δυναμικά 'Καλημέρα!' ή 'Καλησπέρα!' (με script μέσα στο κώδικα την σελίδας)

Υποδειγματική λύση:

·         Δημιουργία καινούργιου Ιστότοπου (New Empty Web Site), Γλώσσα C#, όνομα: Lab1

·         Εισαγωγή 3 web forms: Default.aspx, Page1.aspx, Page2.aspx

·        

                    Label1.Text = "Hello there " + TextBox1.Text  + ", πώς αισθάνεσαι σήμερα;";

 

·        

<script runat="server">

      protected void Page_Load(object sender, EventArgs e)

    {

        if (DateTime.Now.Hour < 12)

            Label1.Text = "Καλημέρα!";

        else

            Label1.Text = "Καλησπέρα!";

 

    }

   

</script>

·         Στην Page2.aspx

<script runat="server">

 protected void Button1_Click(object sender, EventArgs e)

    {

        Label1.Text = "Hello there " + TextBox1.Text  + ", πώς αισθάνεσαι σήμερα;";

    }

</script>

 

2.2. Χρήση και επεξεργασία προτύπων και μορφοποιήσεων CSS

Εκφώνηση:

Δημιουργήστε έναν Ιστότοπο τεσσάρων σελίδων (Home, Technology, Finance, Sports) παρόμοιο με την παραπάνω εικόνα, κάνοντας χρήση σελίδας-πρότυπο (master page) και μορφοποιήσεων Cascading Style Sheet (CSS). Για το μενού επιλογών χρησιμοποιείστε το εξειδικευμένο σχετικό εργαλείο (Menu control στην κατηγορία Navigation).















Εικόνα 5.2 Βασική, αρχική Ιστοσελίδα με μορφοποίηση

Δημιουργήστε έναν Ιστότοπο τεσσάρων σελίδων (Home, Technology, Finance, Sports) παρόμοιο με τη παραπάνω εικόνα, κάνοντας χρήση σελίδας-πρότυπο (master page) και μορφοποιήσεων Cascading Style Sheet (CSS). Για το μενού επιλογών χρησιμοποιείστε το εξειδικευμένο σχετικό εργαλείο (Menu control στη κατηγορία Navigation).

Υποδειγματική λύση:









Εικόνα 5.3 Γενική μορφή κανόνων CSS

body

{

    background-color: navy;

}


Προαιρετικά μπορούμε να βάλουμε και font-family, font-size, κ.α. Σε ότι δεν ορίσουμε, ισχύουν οι προεπιλογές (“browser default”)

<link href="StyleSheet.css" rel="stylesheet" type="text/css" />

#page

{

    border-style: outset;

    margin: 0px auto auto auto;

    width: 950px;

    color: silver;

    background-color: blue;

}

 

 <img src="images/university_logo.jpg" />

#header

{

    height: 234px;

}

 

img

{

  float: left;  /* απαραίτητο ώστε να έχουμε εικόνα και κείμενο μαζί */

         /* προσέξτε ότι το img δεν έχει πριν ‘#’ γιατί δεν είναι id */

   

}

 

#title

{

  float: right;  /* απαραίτητο ώστε να έχουμε εικόνα και κείμενο μαζί */

  width: 600px;

  height: 234px;

  color: navy;

  text-align: center;

  line-height: 250px;  /* γρήγορη τεχνική για κάθετο κεντράρισμα */

  font-size: 60px;

  font-weight: bold;

}

 

#menu

{

    border-style: outset;

    border-width: thin;

}

 

#content

{

    margin: 10px;

}

 

#content img   /* img που εμπεριέχεται σε content*/

{

    border: thick double #800000;

    height: 68px;

    width: 100px;

}

 

#content h3   /* h3 που εμπεριέχεται σε content*/

{

    color:black;

}

2.3. Προσαρμογή έτοιμου Ιστότοπου - χρήση των Application και Session Events

Εκφώνηση:

Δημιουργήστε έναν Ιστότοπο (με κεφαλίδα 'Multi-User Site') αξιοποιώντας και προσαρμόζοντας την παρεχόμενη λειτουργικότητα των συστατικών που αυτόματα δημιουργεί το περιβάλλον ανάπτυξης VS 2012. Στη συνέχεια προσθέστε μια νέα σελίδα Statistics.aspx, σύμφωνη με το υπάρχον πρότυπο, και συνδέστε την επιλογή 'Στατιστικά' του μενού. Στη σελίδα αυτή αρχικά μέσω 2 textboxes δώστε ένα παράδειγμα χρήσης της ιδιότητας IsPostBack που ελέγχει την ύπαρξη/διατήρηση ενός session και στη συνέχεια δημιουργείστε κατάλληλα application και session events για να εμφανίζετε ένα μήνυμα που ενημερώνει πόσοι χρήστες χρησιμοποιούν αυτή τη στιγμή τον Ιστότοπο (δείτε την παρακάτω εικόνα).

















Εικόνα 5.4 Ιστοσελίδα με πολλούς χρήστες ταυτόχρονα

Υποδειγματική λύση:

 <p class="site-title">

        <a runat="server" href="~/">Multi-User Site</a>
 </p>

             <p>&copy; <%: DateTime.Now.Year %> - Lab 3 </p>

 

<title><%: Page.Title %> - Lab 3 – T.H.E.</title>

   ( … και βρίσκουμε στο αρχείο Bundle.config την αναφορά που συνδέει το αρχείο μορφοποιήσεων με τη σελίδα-πρότυπο.)  

.site-title {

      color: #c8c8c8;

      font-family: Rockwell, Consolas, "Courier New", Courier, monospace;

      font-size: 2.3em;

à  font-variant: small-caps;

       margin: 0;

}

 

background-color: #990033;

   <nav>

                    <ul id="menu">

                        <li><a runat="server" href="~/">Home</a></li>

                        <li><a runat="server" href="~/About">About</a></li>

                        <li><a runat="server" href="~/Contact">Contact</a></li>

                    <li><a runat="server" href="~/Statistics">Στατιστικά</a></li>

                    </ul>

   </nav>

<link href="~/favicon2.ico" rel="shortcut icon" type="image/x-icon" />

Βρείτε/δείτε που εμφανίζεται, κάνοντας εκτέλεση του Ιστότοπου.

Ιδιότητα IsPostBack και έλεγχος για session:

protected void Button1_Click(object sender, EventArgs e)

{

TextBox2.Text = TextBox1.Text;

}

 

string minima="Καλησπέρα";

          protected void Page_Load(object sender, EventArgs e)

          {            

            TextBox1.Text = minima;

           }

 

string minima="Καλησπέρα";

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack) {

  TextBox1.Text = minima;

}

}

 

Συμβάντα εφαρμογής (καθολικά για όλον τον Ιστότοπο - application events) και συμβάντα συνεδρίας χρήστη (user session events):

void Application_Start(object sender, EventArgs e)

{

// Code that runs on application startup

Application["UserCount"] = 0;

 

}

 

void Session_Start(object sender, EventArgs e)

{

// Code that runs when a new session is started

Application["UserCount"] = Convert.ToUInt32(Application["UserCount"]) + 1;

}

 

    void Session_End(object sender, EventArgs e)

{

       // Code that runs when a session ends.

        // Note: The Session_End event is raised only when the sessionstate mode

        // is set to InProc in the Web.config file. If session mode is set to StateServer

      // or SQLServer, the event is not raised.

     Application["UserCount"] = Convert.ToUInt32(Application["UserCount"]) - 1;

    }

 

protected void Page_Load(object sender, EventArgs e)

{

   

    Label1.Text = "Αυτή τη στιγμή χρησιμοποιούν τον Ιστότοπο " +  
     Convert.ToString(Application["UserCount"]) + "
χρήστες";

 }

Προσοχή: Δε βλέπουμε τον αριθμό των χρηστών να ελαττώνεται. Για να γίνει το συμβάν Session_End, σύμφωνα και με τα σχόλια που υπάρχουν στο αντίστοιχο τμήμα του αρχείου Global.asax, πρέπει να πάμε στο αρχείο Web.config, μέσα στο τμήμα του <system.web>, και να βάλουμε:

                <sessionState    mode = “inProc” …    timeout=”1” />

Έτσι θέτουμε το mode στην επιθυμητή κατάσταση και  αλλάζουμε σε 1 λεπτό τον χρόνο αδράνειας για τη λήξη του session (για να μπορούμε να κάνουμε έλεγχο αμέσως μετά από ένα λεπτό αδράνειας).

2.4. Φόρμες και Επικύρωση Δεδομένων (Validation)

Εκφώνηση:

Δημιουργήστε έναν Ιστότοπο (με κεφαλίδα 'Contact Site') αξιοποιώντας την παρεχόμενη λειτουργικότητα των συστατικών που αυτόματα δημιουργεί το περιβάλλον ανάπτυξης VS 2012. Κάντε μια σειρά αλλαγών: αλλάξτε το υπόβαθρο του κύριου μέρους των σελίδων σε καφέ, ενώ στο υποσέλιδο το υπόβαθρο κάντε το κόκκινο. Τα γράμματα στο υπόβαθρο να είναι κίτρινα. Τέλος, όταν περνάει το ποντίκι πάνω από το μενού (event 'hover') τα γράμματα κάντε τα να γίνονται κίτρινα. Στη συνέχεια προσθέστε μια νέα σελίδα Validators.aspx, σύμφωνη με το υπάρχον πρότυπο, και συνδέστε την επιλογή 'Φόρμα' του μενού. Στη σελίδα αυτή βάλτε έναν πίνακα 18 γραμμών και 2 στηλών για να δώσετε σε μια στήλη περιγραφές στοιχείων (π.χ. όνομα, πόλη κλπ.) που πρέπει ο χρήστης να γεμίσει στα πεδία της διπλανής στήλης (δείτε την παρακάτω εικόνα). Χρησιμοποιείστε εργαλεία επικύρωσης (validators) για να ελέγξετε την εισαγωγή των στοιχείων που κάνει ο χρήστης (έλεγχος ότι δεν έμεινε ένα πεδίο της φόρμας άδειο, έλεγχος ότι έγινε μια επιλογή από μια πτυσσόμενη λίστα, έλεγχος ότι το mail που δόθηκε έχει σωστή 'μορφοποίηση', έλεγχος ότι πατήθηκε ένα checkbox).

 





















Εικόνα 5.5 Σελίδα επικοινωνίας

Υποδειγματική λύση:

                                 color: yellow;

.float-left {

   

    color: yellow;

}

ul#menu li a:hover {

           

            color: yellow;

        }

    




















Εικόνα 5.6 Φόρμα επικοινωνίας

 

Κάντε κλικ στα εικονίδια του σχήματος για επεξήγηση

shape1

Εικόνα 5.7 Χρήση Validators

 










Εικόνα 5.8 Επιτυχής καταχώρηση δεδομένων φόρμας

        if (Page.IsValid) {

             ScriptManager.RegisterClientScriptBlock(Page, typeof(Page), "ClientScript",
                   "alert('T
α στοιχεία σας ελήφθησαν επιτυχώς')", true);

             }

 

label {

       /*   display: block; */

        font-size: 1.2em;

        font-weight: 600;

    }

 





































Εικόνα 5.9 Παράδειγμα με λάθη σε χρήση φόρμας

<asp:ValidationSummary ID="ValidationSummary1" runat="server" 
             ForeColor="Red"     HeaderText="
Προσοχή:" />

προσθέτουμε πριν το </asp:Content>, ένα CustomValidator (από το Toolbox-> Validation). Παρατηρούμε ότι δημιουργήθηκε ο ακόλουθος κώδικας: 

<asp:CustomValidator ID="CustomValidator1" runat="server"

ErrorMessage="CustomValidator">
     </
asp:CustomValidator>

 

<asp:CustomValidator ID="CustomValidator1" runat="server" ForeColor =
     "
Red"  ErrorMessage=" Παρακαλώ  πατήστε το Checkbox!" 

      OnServerValidate="CustomValidator1_ServerValidate">
 </
asp:CustomValidator>

protected void CustomValidator1_ServerValidate
              (object source, ServerValidateEventArgs args)

          {

                 args.IsValid = CheckBox1.Checked;

          }

 

<asp:CustomValidator ID="CustomValidator1" runat="server"

ForeColor="Red" OnServerValidate="CustomValidator1_ServerValidate">   Παρακαλώ πατήστε το Checkbox! 

·         </asp:CustomValidator>

2.5. Σύνδεση σε Βάση Δεδομένων

Εκφώνηση:

Δημιουργήστε έναν Ιστότοπο (με κεφαλίδα 'Database Site') αξιοποιώντας την παρεχόμενη λειτουργικότητα των συστατικών που αυτόματα δημιουργεί το περιβάλλον ανάπτυξης VS 2012. Δημιουργήστε μια SQL Server βάση δεδομένων 'Customers.mdf' με έναν πίνακα πελατών 'Customer'. O πίνακας θα έχει 5 πεδία (δείτε την παρακάτω εικόνα). Εισάγετε σε αυτόν 4 γραμμές (εγγραφές) με στοιχεία. Στη συνέχεια προσθέστε μια νέα σελίδα 'Dbase.aspx', σύμφωνη με το υπάρχον πρότυπο, και συνδέστε τη με το μενού. Στη σελίδα αυτή να εμφανίσετε το περιεχόμενο του πίνακα Customer (στη κλασική μορφή πλέγματος στηλών και γραμμών). Προσθέστε ακόμη μια σελίδα 'Customers.aspx', σύμφωνη με το υπάρχον πρότυπο, και συνδέστε τη με το μενού. Στη σελίδα αυτή να εμφανίζονται μόνο τα πεδία 'Όνομα' και 'Επώνυμο' όλων των πελατών σε μορφή πλέγματος και επιπλέον να δίνετε τη δυνατότητα ο χρήστης να επιλέγει μια εγγραφή (έναν πελάτη) και από κάτω να εμφανίζονται στη σελίδα όλα τα πεδία-στοιχεία του πελάτη αυτού (δείτε την τελευταία εικόνα της παραγράφου).


Βάση δεδομένων είναι μια συλλογή δεδομένων από μορφοποιημένα δεδομένα τα οποία έχουν υψηλό βαθμό οργάνωσης που επιτρέπει την ανάκτηση και αποθήκευση πληροφοριών κατά απαίτηση.

Υποδειγματική λύση:

CREATE TABLE [dbo].[Customer]

























Εικόνα 5.10 Δημιουργία βάσης δεδομένων

 




















Εικόνα 5.11 Αποθήκευση βάσης δεδομένων

 










Εικόνα 5.12 Εισαγωγή δεδομένων στη βάση

 

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)

    {

        DetailsView1.PageIndex = GridView1.SelectedIndex;

    }


Εικόνα 5.13 Προβολή δεδομένων από μια βάση

2.6. Διαχείριση Βάσης Δεδομένων μέσω Ιστοσελίδας

Εκφώνηση:

Δημιουργήστε έναν Ιστότοπο (με κεφαλίδα 'Διαχείριση Database Site') αξιοποιώντας την παρεχόμενη λειτουργικότητα των συστατικών που αυτόματα δημιουργεί το περιβάλλον ανάπτυξης VS 2012. Δημιουργήστε μια SQL Server βάση δεδομένων 'Companies.mdf' με έναν πίνακα εταιριών 'Company'. O πίνακας θα έχει 5 πεδία (δείτε την παρακάτω εικόνα). Εισάγετε σε αυτόν 9 γραμμές (εγγραφές) με στοιχεία, για να μπορέσετε στη συνέχεια όταν παρουσιάζετε τα δεδομένα σε μια Ιστοσελίδα να 'πειραματιστείτε' με τη σελιδοποίηση των δεδομένων (θέτοντας πχ. το page size = 4). Στη συνέχεια προσθέστε μια νέα σελίδα 'Companies.aspx', σύμφωνη με το υπάρχον πρότυπο, και συνδέστε τη με το μενού. Στη σελίδα αυτή να εμφανίσετε το περιεχόμενο του πίνακα 'Company' (στη κλασική μορφή πλέγματος στηλών και γραμμών), όμως επιπλέον να δώσετε στους χρήστες του Ιστότοπου αυξημένες δυνατότητες - εισαγωγής/ενημέρωσης/διαγραφής των δεδομένων στον πίνακα αυτό. Ειδικότερα για την 'επικίνδυνη' ενέργεια της 'Διαγραφής', δημιουργήστε με κώδικα μια πιο ασφαλή έκδοση της εντολής 'Delete', αφού πριν την όποια διαγραφή, θα πρέπει να ζητείται επιβεβαίωση. Ειδικότερα για την υποστήριξη της λειτουργίας 'εισαγωγής', πρέπει να ξεφύγουμε από την παρουσίαση δεδομένων σε μορφή πλέγματος: πηγαίνετε στην υπάρχουσα σελίδα 'Contact.aspx', σβήστε το υπάρχον περιεχόμενο και μέσω ενός εργαλείου FormView δώστε δυνατότητες εισαγωγής/ενημέρωσης/διαγραφής των δεδομένων στον πίνακα Company (δείτε την τελευταία εικόνα της παραγράφου).

Υποδειγματική λύση:

CREATE TABLE [dbo].[Company]


Εικόνα 5.14 Τροποποίηση πεδίων σε πίνακα

 

Εικόνα 5.15 Εισαγωγή δεδομένων σε πίνακα

 

·         Τοποθετούμε το Description πάνω από το Name

·         Αλλάζουμε το HeaderText του Description σε ‘Περιγραφή’ και του Name σε ‘Επωνυμία’

<asp:TemplateField>

                        <ItemTemplate>

                                  <asp:LinkButton ID="LinkButton1" Runat="server"

                                                OnClientClick="return confirm('Είσαι σίγουρος;');"

                                CommandName="Delete">Διαγραφή</asp:LinkButton>

                       </ItemTemplate>

                </asp:TemplateField>

            </Columns>

 

Δημιουργήσαμε μια πιο ασφαλή έκδοση για την εντολή Delete, αφού πριν την όποια διαγραφή, μας ζητείται να την επιβεβαιώσουμε.

Μπορούμε τώρα να απενεργοποιήσουμε το εξ’ ορισμού link του Delete, βάζοντας False στην αντίστοιχη ιδιότητα:   ShowDeleteButton="False"


Εικόνα 5.16 Ασφαλής 'Διαγραφή' στη βάση δεδομένων 

Εικόνα 5.17 Εισαγωγή ('New') εγγραφής μέσω Ιστοσελίδας

2.7. Ηλεκτρονικό Κατάστημα με ASP.NET Web Forms

Εκφώνηση:

Στην άσκηση αυτή δημιουργούμε έναν Ιστότοπο (με κεφαλίδα 'Ηλεκτρονικό Κατάστημα') που ξεκινώντας από την παρεχόμενη λειτουργικότητα των συστατικών που αυτόματα δημιουργεί το περιβάλλον ανάπτυξης VS 2012, προχωρούμε στην υποστήριξη βασικών λειτουργιών ηλεκτρονικού καταστήματος με ένα στοιχειώδες καλάθι αγορών. Υπάρχουν αρκετά στοιχεία προηγούμενων ασκήσεων που ενσωματώνονται εδώ, όπως και αρκετά νέα.


Ένα ηλεκτρονικό κατάστημα υπερτερεί σε αρκετά σημεία ενός φυσικού καταστήματος: είναι άμεσα προσπελάσιμο από παντού στον κόσμο, η αναζήτηση προϊόντων και η σύγκριση τιμών είναι ευκολότερη και είναι ανοιχτό συνέχεια.


Ένα καλάθι αγορών είναι ένα εικονικό καλάθι στο οποίο οι χρήστες ενός ηλεκτρονικού καταστήματος έχουν τη δυνατότητα να βάζουν και να βγάζουν προϊόντα κατά της διάρκεια της επίσκεψης τους σε αυτό. Ανά πάσα στιγμή είναι ενήμεροι για την αξία των προϊόντων που πρέπει να πληρώσουν για την απόκτησή τους.

 

 

 

Υποδειγματική λύση:

CREATE TABLE [dbo].[Product]

Εικόνα 5.18 Εισαγωγή κλειδιού σε πίνακα της βάσης δεδομένων

 

Εικόνα 5.19 Εισαγωγή ιδιοτήτων κλειδιού σε πίνακα της βάσης δεδομένων


Εικόνα 5.20 Εισαγωγή δεδομένων σε πίνακα

 


Εικόνα 5.21 Προβολή αρχικής σελίδας του ηλεκτρονικού καταστήματος

 

·         Column: Available

·         Operator: =

·         Source: None

·         Value: True

·         Πατάμε το κουμπί Add και το OK

·         Βλέπουμε ότι σχηματίστηκε το παρακάτω query:

SELECT * FROM [Product] WHERE ([Available] = @Available)


Εικόνα 5.22 Προβολή προϊόντων 

Εικόνα 5.23 Προβολή προϊόντων με δυνατότητα επιλογής τους

 

·         Αφαιρούμε τα πεδία  ProductID , Description, Available και Quantity

·         Αλλάζουμε στα πεδία που έμειναν τα HeaderText στα Ελληνικά (Όνομα, Τιμή)

·         Δίνουμε στο πεδίο Price το {0:c} ως DataFormatString

·         Στο Select Δίνουμε ως SelectText το ‘Λεπτομέρειες’ και μετακινούμε το πεδίο τελευταίο.


Εικόνα 5.24 Αλλαγή ιδιοτήτων προβολής 

Εικόνα 5.25 Προσαρμοσμένη προβολή προϊόντων

 

Εικόνα 5.26 Αλλαγή ιδιοτήτων προβολής

 

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)

    {

        DetailsView1.PageIndex = GridView1.SelectedIndex + (GridView1.PageIndex * GridView1.PageSize);

    }

Εικόνα 5.27 Προβολή σελίδας με δύο συνδεδεμένους μηχανισμούς

 

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)

    {

        DetailsView1.PageIndex = GridView1.SelectedIndex + (GridView1.PageIndex * GridView1.PageSize);

        DetailsView1.Visible = true;

    }

 

protected void Button1_Click(object sender, EventArgs e)

    {

        DetailsView1.Visible = false;

        Button1.Visible = false;

    }

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)

    {

        DetailsView1.PageIndex = GridView1.SelectedIndex + (GridView1.PageIndex * GridView1.PageSize);

        DetailsView1.Visible = true;

        Button1.Visible = true;

}

 

Εικόνα 5.28 Σχετικά με το κατάστημα (About Page)

 

Δημιουργία Ρόλων και Χρηστών (security issues)

Εικόνα 5.29 Σελίδα διαχείρισης (ASP.NET Configuration)

 

·         Administrator, Allow

 

Εικόνα 5.30 Δικαιώματα πρόσβασης (access rules)

 

protected void Page_Load(object sender, EventArgs e)

    {

        if (!User.IsInRole("Administrator"))

            Server.Transfer("../OxiProsvasi.aspx");

    }

 

Εικόνα 5.31 Μήνυμα προς μη εξουσιοδοτημένους χρήστες

 

B’ μέρος (στοιχειώδες καλάθι αγορών):

·         Administrator, Allow

·         Customer, Allow

                   <asp:TemplateField HeaderText="Νο."></asp:TemplateField>

                 <asp:TemplateFieldHeaderText="Νο.">

                 <ItemTemplate><%#Container.DataItemIndex + 1 %></ItemTemplate>

                  </asp:TemplateField>

              Protected void Button2_Click(object sender, EventArgs e)

                 {

                   Session["ProductID"] = DetailsView1.DataKey.Value;  

                   Response.Redirect("~/Registered/Cart.aspx");

                  }

Εικόνα 5.32 Στοιχειώδες καλάθι αγορών

 

   <div class="content-wrapper">

       <h2>Καλάθι Αγορών</h2>

       <p>

           <asp:Label ID="Label1" runat="server"></asp:Label>

       </p>

   </div>

  

           Protected void Page_Load(object sender, EventArgs e)

              {

               if (Session["ProductID"] == null)

               {

                  Label1.Visible = true;

                  Label1.Text = "Το καλάθι αγορών σας είναι άδειο";

                }

              else

                 Label1.Visible = false;

          }

Εικόνα 5.33 Άδειο καλάθι αγορών

·         Column: ProductID

·         Operator: =

·         Source: Session

·         Session Field: ProductID

·         Πατάμε το κουμπί Addκαι το OK

·         Βλέπουμε ότι σχηματίστηκε το παρακάτω query:

SELECT * FROM [Product] WHERE ([ProductID] = @ProductID)

<asp:SqlDataSourceID="SqlDataSource1"runat="server"

  ConnectionString="<%$ConnectionStrings:ConnectionString%>"

  SelectCommand="SELECT * FROM [Product] WHERE ([ProductID] =  @ProductID)">

    <SelectParameters>

      <asp:SessionParameterName = "ProductID” SessionField =

         "ProductID" Type="Int32"/>

  </SelectParameters>

</asp:SqlDataSource>

 

·         Αφαιρούμε τα πεδία ProductID, Quantity και Available και αλλάζουμε τα HeaderText στα Ελληνικά (Όνομα, Περιγραφή, Τιμή)

·         Δίνουμε στο Πεδίο Price το {0:c} ως Data Format String

3. Ασκήσεις Αυτοαξιολόγησης

3.1. Μετρήσεις συμβάντων

Εκφώνηση:

Στην σελίδα 'Statistics' του Ιστότοπου της άσκησης 2.3, προσθέστε δυο Label κάτω από το κουμπί (όπως στην παρακάτω εικόνα), με ID: Label2 και Label3. Γράψτε τον κατάλληλο κώδικα ώστε το Label2 να περιέχει μήνυμα με τον αριθμό των clicks που είχαν κάνει οι προηγούμενοι χρήστες πριν προσπελάσει τον Ιστότοπο ο τρέχων χρήστης, και στο Label3 μήνυμα με το τρέχoν πλήθος των clicks όλων των χρηστών (προηγούμενων + συνδεδεμένων αυτή τη στιγμή).

 

Εικόνα 5.34 Μετρήσεις συμβάντων

3.2. Σύνδεση μηχανισμών

Εκφώνηση:

Στην σελίδα 'Contact' του Ιστότοπου της άσκησης 2.6 προσθέστε ένα GridView control, το όποιο θα δείχνει μόνο τα πεδία 'Description' και 'Name' και θα έχει επιπλέον δυνατότητα επιλογής γραμμής (Select), καθώς και δυνατότητα Sorting και Paging με PageSize 3.. H επιλογή κάποιας Εταιρίας στο GridView θα προκαλεί την εμφάνιση του στο FormView (το οποίο όμως δε θα έχει paging).

Εικόνα 5.35 Σύνδεση μηχανισμών

3.3. Σελίδα Διαχείρισης

Εκφώνηση:

Στην σελίδα 'AdminSelida' του Ιστότοπου της άσκησης 2.7, να κάνετε τις απαραίτητες ενέργειες, ώστε ο διαχειριστής να μπορεί να ενημερώνει τη βάση. Προσοχή: η Διαγραφή να γίνεται με ασφαλή τρόπο (δηλαδή να ζητείται επιβεβαίωση, ενώ πρέπει να μπορεί να γίνεται και Εισαγωγή νέας εγγραφής εκτός από Διόρθωση.

 

Εικόνα 5.36 Σελίδα διαχείρισης

 

Εικόνα 5.37 Σελίδα διαχείρισης - δυνατότητα εισαγωγής νέας εγγραφής

 

Εικόνα 5.38 Εισαγωγή νέου προϊόντος

 

Εικόνα 5.39 Σελίδα διαχείρισης - ενημερωμένη λίστα προϊόντων

3.4. Ολοκλήρωση αγοράς

Εκφώνηση:

Στην σελίδα 'Cart' του Ιστότοπου της άσκησης 2.7, προσθέστε ένα κουμπί με το κείμενο "Ολοκλήρωση αγοράς" το οποίο θα κρύβει το προϊόν και θα εμφανίζεται το μήνυμα "H αγορά σας ολοκληρώθηκε επιτυχώς". Το κουμπί αυτό δε θα πρέπει να φαίνεται όταν το καλάθι είναι άδειο.

Εικόνα 5.40 Καλάθι αγορών με καταχωρημένο προϊόν

 

 

Εικόνα 5.41 Ολοκληρωμένη αγορά


Σημείωση: Στον Ιστότοπο του συγγράμματος (http://ec-tech.uom.gr/WT-ECOM), θα βρείτε τον πηγαίο κώδικα για όλες τις υποδειγματικά λυμένες ασκήσεις, καθώς και για τις ασκήσεις αυτοαξιολόγησης.

4. Συμπεράσματα

Στο κεφάλαιο αυτό παρουσιάστηκε ένα σύνολο εργαστηριακών ασκήσεων, με σκοπό την κατανόηση τεχνικών προγραμματισμού από την πλευρά του διακομιστή (server-side scripting), με χρήση της τεχνολογίας ASP.NET (Active Server Pages). Οι ασκήσεις αυτές έχουν υποδειγματικά επιλυθεί στο περιβάλλον Visual Studio και χρησιμοποιούν ως βασική γλώσσα προγραμματισμού στον Ιστό τη γλώσσα C#. Μέσω των εργαστηριακών ασκήσεων παρουσιάζονται τεχνικές ανάπτυξης εφαρμογών Ιστού, ενώ ιδιαίτερη έμφαση δίνεται σε εφαρμογές που υποστηρίζουν συναλλαγές Ηλεκτρονικού Εμπορίου.

5. Τεστ αξιολόγησης


Σημείωση: Η διαβάθμιση δυσκολίας των κριτηρίων αξιολόγησης δίνεται με το πλήθος των αναγραφόμενων αστερίσκων.

6. Βιβλιογραφία

Gaylord, J. N., Wenz, C., Rastogi, P., Miranda, T. & Hanselman, S. (2013). Professional Asp. net 4.5 in C# and VB. John Wiley & Sons.

Spaanjaars, I. (2014). Beginning ASP.NET 4.5.1: in C# and VB, Wrox Programmer to Programmer, Wrox.

Wojcieszyn, F. (2014). ASP. NET Web API 2 Recipes: A Problem-Solution Approach. Apress.

 

Χρήσιμοι δικτυακοί τόποι:

Developing Web Applications with ASP.NET:
https://msdn.microsoft.com/en-us/library/bb400852%28v=vs.110%29.aspx
C# Web Development:
http://www.bellevuecollege.edu/ce/category/c-web-development/
Web application development resources:
https://msdn.microsoft.com/en-us/web-app-development-msdn.aspx
ASP.NET tutorial:
http://www.w3schools.com/aspnet/
Visual C# Resources:
https://msdn.microsoft.com/en-us/vstudio/hh341490.aspx


Τέλος Κεφαλαίου