Đề tài Tìm hiểu và xây dựng ứng dụng web siêu thị trực tuyến với ASP.NET MVC

MỤC LỤC

GIỚI THIỆU CHUNG 1

CHƯƠNG 1: MỞ ĐẦU 3

1.1. Tổng quan về ASP.NET MVC 3

1.2. Tổng quan về ứng dụng thương mại siêu thị trực tuyến 3

2.1. Yêu cầu đặt ra cho kiến trúc hệ thống 4

2.2. Thiết kế kiến trúc hệ thống 4

2.2.1. Thiết kế kiến trúc phân tầng 5

2.2.2. Lựa chọn lưu trữ dữ liệu và thiết kế tầng truy xuất dữ liệu 5

2.2.3. Thiết kế tầng logic nghiệp vụ 9

2.2.4. Xây dựng vùng nhớ đệm - caching , sử dụng mạng phân phối nội dung tăng hiệu năng của hệ thống 10

2.2.5. Tầng trình diễn (UI hay Views) 10

CHƯƠNG 2: TÌM HIỂU ASP.NET MVC VÀ LINQ 12

1.1. ASP.NET MVC là gì? 12

1.1.1. Mô hình MVC cơ bản 12

1.1.2. Một vài đặc tính của ASP.NET MVC 12

1.2. Sự khác biệt so với Web Form 13

1.3. Quá trình thực thi một ứng dụng nền web ASP.NET MVC 15

2.1. Linq to SQL là gì? 16

2.2. Mô hình hóa CSDL dùng Linq to SQL 16

2.3. Tìm hiểu lớp DataContext 18

2.4. Các ví dụ Linq to SQL 18

2.5. Tổng kết 21

CHƯƠNG 3: PHÂN TÍCH THIẾT KẾ ỨNG DỤNG 22

1.1. Thiết kế hệ thống 22

1.1.1. Các module của hệ thống 22

1.1.2. Mối quan hệ giữa các module 23

1.2. Đặc tả sơ lược các module 23

1.2.1. Module hồ sơ và thành viên 23

1.2.2. Module lấy ý kiến khách hàng 23

1.2.3. Module thương mại 23

1.2.4. Module gửi thư 23

1.2.5. Module diễn đàn 23

1.2.6. Module tìm kiếm siêu thị 24

1.2.7. Module bài báo, tin tức, và blog 24

1.2.8. Module quốc tế hóa 24

1.2.9. Module kiểm thử 24

2.1. Tổng quan về module 25

2.2. Sơ đồ chức năng 26

2.3. Các bảng DL của module 26

2.3.1. Tạo bảng DL 26

2.3.2. Cấu hình trong web.config cho membership, role và profile: 27

2.4. Models 28

2.4.1. Lớp UserInformation 28

2.4.2. Lớp ProfileInformation 28

2.5. Controllers 29

2.6. Views 30

2.7. Sử dụng Javascript 31

2.8. Cấu hình định tuyến 32

2.9. Xử lí xác thực người dùng 32

3.1. Tổng quan về module 33

3.2. Sơ đồ chức năng 34

3.3. Tìm hiểu , sử dụng Paypal cho chức năng thanh toán (check out) 34

3.3.1. Tạo tài khoản ảo cho mục đích kiểm thử 35

3.3.2. Quá trình thanh toán với Paypal từ website thương mại 35

3.4. Các bảng dữ liệu của module 37

3.5. Lớp thiết lập cấu hình cho module thương mại 37

3.6. Model 38

3.7. Controller 39

3.8. View 40

3.9. Sử dụng JavaScript 42

3.10. Cấu hình định tuyến 45

4.1. Tổng quan về module 47

4.2. Các vấn đề cần quan tâm khi xây dựng module: 47

4.3. Sơ đồ chức năng 50

4.4. Các bảng dữ liệu 50

4.5. Thiết kế lớp cấu hình cho module 51

4.6. Model 51

4.7. Controller 52

4.8. View 52

4.9. Cấu hình định tuyến 53

5.1. Tổng quan về module 54

5.2. Sơ đồ chức năng 54

5.3. Các bảng dữ liệu 55

5.4. Thiết kế lớp cấu hình cho module 56

5.5. Model 56

5.6. Controller 57

5.7. View 58

5.8. Sử dụng javascript 58

5.9. Cấu hình định tuyến 63

6.1. Tổng quan về module 65

6.2. Sơ đồ chức năng 65

6.3. Các bảng dữ liệu 66

6.4. Xây dựng lớp ForumsElement cho thiết lập cấu hình module 66

6.5. Model 66

6.6. Controller 67

6.7. View 68

6.8. Sử dụng javascript 69

6.9. Cấu hình định tuyến 73

6.10. Cấu hình trong tệp web.config 74

7.1. Tổng quan về module 75

7.2. Sơ đồ chức năng 75

7.3. Các bảng dữ liệu 76

7.4. Xây dựng lớp ArticleElement cho thiết lập cấu hình của module 76

7.5. Model 77

7.6. Controller 78

7.7. View 79

7.8. Sử dụng javascript 80

7.9. Cấu hình định tuyến 86

8.1. Tổng quan về module 90

8.2. Xây dựng module 90

8.2.1. Các Service hỗ trợ quốc tế hóa trong Framework của Microsoft 90

8.2.2. Xây dựng các tệp tài nguyên 91

8.2.3. Controller của module 93

8.2.4. View tương ứng của module 93

CHƯƠNG 4: SỬ DỤNG WEB FORMS TRONG ỨNG DỤNG ASP.NET MVC 95

1.1. Các lí do cho sự kết hợp giữa 2 công nghệ 95

1.2. Tại sao có thể thực hiện được sự kết hợp này 95

1.3. Các bước để kết hợp các trang WebForms vào ứng dụng ASP.NET MVC 95

2.1. Tổng quan về module 96

2.2. Sơ đồ chức năng 96

2.3. Phân tích cách xây dựng chức năng 96

2.4. Bảng CSDL 97

2.5. Các lớp hỗ trợ trong module 97

2.6. View 100

2.7. Thêm định tuyến cho các trang view của module 101

2.8. Vấn đề bảo mật 102

CHƯƠNG 5: TRIỂN KHAI ỨNG DỤNG VÀ HƯỚNG PHÁT TRIỂN 103

1.1. Các bước triển khai 103

1.2. Triển khai Global Store Site 103

1.3. Cấu hình IIS 7.0 cho Framework MVC sử dụng Microsoft Web Platform Installer 104

1.4. Thêm Global Store site vào IIS 7.0 107

2.1. Hỗ trợ tìm kiếm sản phẩm mở rộng 109

2.2. Mở rộng chức năng tìm kiếm cửa hàng gần nhất 109

2.3. Xây dựng module báo cáo tình hình bán hàng của siêu thị kết xuất ra các tệp định dạng Execel , Pdf 109

KẾT LUẬN 110

TÀI LIỆU THAM KHẢO 111

DANH MỤC HÌNH ẢNH 112

 

 

doc126 trang | Chia sẻ: lethao | Lượt xem: 3010 | Lượt tải: 5download
Bạn đang xem trước 20 trang tài liệu Đề tài Tìm hiểu và xây dựng ứng dụng web siêu thị trực tuyến với ASP.NET MVC, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Message(this, "(optional) Enter the order of importance that you want the departments shown in."); }); $("#imageUrl").focus(function() { ShowMessage(this, "The relative web path of an image you want to be shown with products in this department."); }); $("#description").focus(function() { ShowMessage(this, "Enter a short description of the department to display to your users."); }); function ValidateTitle() { return VerifyRequiredField("#title", "required"); } function ValidateImageUrl() { return VerifyRequiredField("#imageUrl", "required"); } function ValidateDescription() { return VerifyRequiredField("#description", "required"); } function ValidateDepartment() { var validTitle = ValidateTitle(); var validImage = ValidateImageUrl(); var validDescription = ValidateDescription(); return validTitle && validImage && validDescription; } $("form.department-create").validate(ValidateDepartment); Tương tự thì tệp manage-product được sử dụng để đảm bảo các trường thông tin trong form tạo sản phẩm được điền vào đúng theo yêu cầu .. /************************************************************************************ Product ***********************************************************************************/ $("#title").focus(function() { ShowMessage(this, "Enter your product name here."); }); $("#sku").focus(function() { ShowMessage(this, "Enter your SKU number here."); }); $("#unitPrice").focus(function() { ShowMessage(this, "Enter the unit price of this product."); }); $("#discountPercentage").focus(function() { ShowMessage(this, "Enter the percent off you want to give for this product."); }); $("#unitsInStock").focus(function() { ShowMessage(this, "Total number of units of this product you have in stock."); }); $("#smallImageURL").focus(function() { ShowMessage(this, "The url to the thumbnail for this product."); }); $("#fullImageURL").focus(function() { ShowMessage(this, "The url to full sized image of this product."); }); function ValidateTitle() { return VerifyRequiredField("#title", "required"); } function ValidateDescription() { return VerifyRequiredField("#description", "required"); } function ValidateProduct() { return ValidateTitle() && ValidateDescription(); } $("form.product-create").validate(ValidateProduct); /*********************************************************************************** * Rich Text Editor ***********************************************************************************/ var bodyEditor; $(document).ready(function() { bodyEditor = new tinymce.Editor("description", __editorConfig); bodyEditor.onChange.add(function(ed) { bodyEditor.save(); }); bodyEditor.onClick.add(function(ed) { ShowMessage("#description", "Enter the description of your product here."); }); bodyEditor.render(); }); // clears the message from the description when another input gets focus $(":input") .focus(function() { HideMessage("#description"); }) .blur(function() { HideMessage("#description"); }); Trong tệp commerece.js có các đoạn mã lệnh cho cả quản lí gian hàng, quản lí sản phẩm ,… Đoạn code thực hiện xóa gian hàng không tạo ra việc Post back toàn bộ: $(".delete-department-button").click(function() { var departmentId = $(this).attr("meta:id"); $.post( "/Commerce/DeleteDepartment", { id: departmentId }, function(data) { $("#department-" + data.object.id).remove(); $("#admin-" + data.object.id).remove(); $("#spacer-" + data.object.id).remove(); }, "json" ); return false; }); Đoạn code thực hiện việc xóa sản phẩm khỏi gian hàng không tạo ra việc postback toàn bộ: $(".delete-product-button").click(function () { var productID = $(this).attr("meta:id"); $.post( "/Commerce/DeleteProduct", { id: productID }, function (data) { $("#product-" + data.object.id).remove(); $("#admin-" + data.object.id).remove(); $("#spacer-" + data.object.id).remove(); }, "json" ); return false; }); Đoạn code thực hiện việc các phương thức ứng với cách thức vận chuyển (như xóa cách thức vận chuyển, thêm cách thức vận chuyển ..) mà không tạo ra Post back toàn bộ: $(".delete-shipping-method-button").live("click", function() { var shippingMethodId = $(this).attr("meta:id"); $.post( "/Commerce/DeleteShipping", { id: shippingMethodId }, function(data) { $("#shipping-method-" + data.object.id).remove(); }, "json" ); return false; }); $("#add-shipping-method-button").click(function() { var title = $("#title").val(); var price = $("#price").val(); $.post( "/Commerce/CreateShipping", { title: title, price: price }, function(data) { var html = ''; html += '' + title + ''; html += '' + price + ''; html += ''; html += ''; $("#shipping-table tbody").append(html); $("#title").val(""); $("#price").val(""); }, "json" ); return false; }); Đoạn code thực hiện việc xóa sản phẩm khỏi giỏ hàng $(".delete-item-button").click(function () { var productId = $(this).attr("meta:id"); var form = $(this).parent("form"); $.post( "/Commerce/DeleteShoppingCartItem", { id: productId }, function (data) { $("#item-" + data.object.id).remove(); //Reload whole page location.reload(form); }, "json" ); return false; }); Cấu hình định tuyến Định tuyến dành cho các view của người dùng có vai trò là storekeeper: routes.MapRoute( "CommerceManageStore", "storekeeper/store", new { controller = "Commerce", action = "ManageStore" } ); routes.MapRoute( "CommerceManageDepartments", "storekeeper/store/departments", new { controller = "Commerce", action = "ManageDepartments" } ); routes.MapRoute( "CommerceCreateDepartment", "storekeeper/store/departments/create", new { controller = "Commerce", action = "CreateDepartment" } ); routes.MapRoute( "CommerceEditDepartment", "storekeeper/store/departments/edit/{departmentId}", new { controller = "Commerce", action = "EditDepartment", departmentId = (int?)null } ); routes.MapRoute( "CommerceManageProducts", "storekeeper/store/products", new { controller = "Commerce", action = "ManageProducts" } ); routes.MapRoute( "CommerceCreateProduct", "storekeeper/store/products/create", new { controller = "Commerce", action = "CreateProduct" } ); routes.MapRoute( "CommerceEditProduct", "storekeeper/store/products/edit/{productId}", new { controller = "Commerce", action = "EditProduct", productId = (int?)null } ); routes.MapRoute( "CommerceManageOrders", "storekeeper/store/orders", new { controller = "Commerce", action = "ManageOrders" } ); routes.MapRoute( "CommerceOrderDetail", "storekeeper/store/orders/{orderId}", new { controller = "Commerce", action = "OrderDetail", orderId = (int?)null } ); routes.MapRoute( "CommerceManageShipping", "storekeeper/store/shipping", new { controller = "Commerce", action = "ManageShipping" } ); Định tuyến dành cho những người dùng còn lại: routes.MapRoute( "CommerceIndex", "", new { controller = "Commerce", action = "Index" } ); routes.MapRoute( "CommerceDepartment", "store/departments/{departmentId}", new { controller = "Commerce", action = "ViewDepartment", departmentId = (int?)null } ); routes.MapRoute( "CommerceProduct", "store/products/{productId}", new { controller = "Commerce", action = "ViewProduct", productId = (int?)null } ); routes.MapRoute( "CommerceCart", "store/cart", new { controller = "Commerce", action = "ViewShoppingCart" } ); routes.MapRoute( "CommerceCompleted", "store/order/completed", new { controller = "Commerce", action = "CompleteOrder" } ); MODULE GỬI THƯ Tổng quan về module Hệ thống luôn có những nội dung cập nhật mới như bài báo , diễn đàn, thông tin sản phẩm mới … để tạo sự chú ý cho những người dùng là khách hàng thì hệ thống có module gửi thư thông báo khách hàng biết có những thông tin mới đó để rồi khách hàng sẽ quay trở lại sử dụng hệ thống trong trường hợp khách hàng đăng kí nhận thư từ hệ thống. Các vấn đề cần quan tâm khi xây dựng module: Để lưu trữ thông tin đăng kí nhận thư của người dùng ta chỉ cần lưu các thông tin như địa chỉ thư điện tử của người dùng, tên, họ, định dạng thư nhận. Tất cả các thông tin này có trong các bảng của module hồ sơ và thành viên ta hoàn toàn có thể tận dụng. Việc tạo và gửi thư điện tử của người dùng với vai trò là nhà quản trị có thể được xây dựng sử dụng namespace System.Net.Mail (namespace này được định nghĩa trong thư viện System.dll) . Các lớp chính cho việc tạo và gửi thư là lớp MailMessage, và lớp SmtpClient cung cấp các phương thức tạo và gửi thư bằng việc kết nối với máy chủ SMTP đã được cấu hình. Với lớp MailMessage ta có thể tạo toàn bộ thông tin đầy đủ của một thư điện tử như sau: // create the message MailMessage mail = new MailMessage(); // set the sender's address and display name mail.From = new MailAddress("dangtienloc@gmail.com", "Loc Dang"); // add a first recipient by specifying only her address mail.To.Add("doangquangminh@gmail.com"); // add a second recipient by specifying his address and display name mail.To.Add(new MailAddress("nguyenducdan@gmail.com", "Dan nguyen")); // add a third recipient, but to the CC field this time mail.CC.Add("mainga@gmail.com"); // set the mail's subject and HTML body mail.Subject = "Sample Mail"; mail.Body = "Hello, my friend!How are you?"; mail.IsBodyHtml = true; // set the mail’s priority to high mail.Priority = MailPriority.High; // add a couple of attachments mail.Attachments.Add( new Attachment(@"c:\demo.zip", MediaTypeNames.Application.Octet)); mail.Attachments.Add( new Attachment(@"c:\report.xls", MediaTypeNames.Application.Octet)); Khi đối tượng MailMessage đã được tạo ta có thể gửi nó bằng phương thức Send của lớp SmtpClient. SmtpClient smtpClient = new SmtpClient(); smtpClient.Send(mail); Trước khi có thể gọi phương thức Send ta cần thiết lập các thông tin cấu hình cho hệ thống để phương thức này có thể thực hiện được như địa chỉ của máy chủ SMTP (thuộc tính SmtpClient Host) , cổng (thuộc tính port) và giấy chứng thực của máy chủ này (thuộc tính credentials) , kết nối được mã hóa với SSL (thuộc tính EnableSsl) và thời gian duy trì từ lúc bắt đầu cho tới khi kết thúc của việc gửi thư ( thuộc tính TimeOut , giá trị mặc định là 100 giây) . Một thuộc tính quan trọng là DeliveryMethod (đây là thuộc tính liệt kê của kiểu dữ liệu SmtpDeliveryMethod. Nó có thể nhận một trong các giá trị sau: Network: Thư được gửi thông qua kết nối trực tiếp tới một máy chủ Smtp cụ thể PickupDirectoryFromIs: Thư điện tử này được chuẩn bị và tệp thư này được lưu vào thư mục mặc định là :\Inetpub\mailroot\Queue. IIS sẽ lấy thư này từ hàng đợi thư để gửi. SpecifedPickupDirectory: Các tệp EML với thư điện tử sẽ được gửi được lưu vào thư mục được chỉ định cho thuộc tính này của đối tượng SmtpClient. Thiết lập này sẽ hữu ích khi ta có một ứng dụng ngoài (không phải IIS) xử lí việc chọn thư và gửi Cấu hình phần gửi thư của hệ thống thương mại trực tuyến Vấn đề thời gian trong xử lí gửi thư có thể là rất lâu khiến người dùng có thể nghĩ hệ thống có lỗi. Việc gửi thư tới hàng ngàn khách hàng đăng kí nhận thư (subscribers) thường phải mất hàng phút trong khi để xử lí một yêu cầu theo tiêu chuẩn chỉ nên trong vài giây. Một giải pháp được đưa ra trong hệ thống đó là khi người dùng nhấn nút submit (tương đương với hành động gửi thư) thì ở phía máy chủ sẽ sinh ra một tiến trình xử lí nhiệm vụ gửi thư mất nhiều thời gian đó ở chế độ nền (backgroudn running mode) và chuyển hướng người dùng về trang quản lí thư . Và ở trang đó người dùng có thể thấy được trạng thái của tất cả các thư đã gửi trong đó có cả thư mới tạo gần nhất và đang được gửi . Để tránh việc phải có một nút refresh ở trang quản lí thư đó để biết được trạng thái thư mới gửi gần nhất ta sẽ sử dụng JQuery để yêu cầu dư liệu từ lớp điều khiển việc gửi thư (newsletters controller class) và rồi tạo một đối tượng DOM đưa trực tiếp dữ liệu về tình trạng xử lí thư vừa gửi vào trang quản lí thư. Đoạn code javascript đó như sau: $.ajax({ type: "GET", url: "/Newsletter/UpdateStatus", dataType: "html", sucess: function (result) { var domElement = $(result); $("#Newsletter_Status_Table").replaceWith(domElement); } }); Tạo các luồng tiến trình chạy nền – đa tiến trình Các luồng tiến trình chạy nền hay luồng phụ được sử dụng để xử lí các nhiệm vụ cần nhiều thời gian mà không ảnh hưởng tới tiến trình chính. Với ASP.NET ta có thể tạo 250 tiến trình chạy cùng một thời điểm trên một CPU Việc tạo mới một tiến trình không khó tuy nhiên ta phải quan tâm tới việc các tiến trình có thể truy cập cùng lúc tới cùng một không gian nhớ. Để tạo tiến trình ta cần namespace System.Threading trong thư viện mscorlib.dll . Dưới đây là một đoạn code tạo tiến trình phụ chạy nền // create and start a background thread with some input parameters object[] parameters = new object[]{"val1", 10, DateTime.Now}; ParameterizedThreadStart pts = new ParameterizedThreadStart(ExecuteTask); Thread thread = new Thread(pts); thread.Priority = ThreadPriority.BelowNormal; thread.Start(parameters); // main thread goes ahead immediately … // the method run asynchronously by the background thread void ExecuteTask(object data) { // extract the parameters from the input data object object[] parameters = (object[])data; string val1 = (string)parameters[0]; int val2 = (int)parameters[1]; DateTime val3 = (DateTime)parameters[2]; // execute time consuming processing here … } Sơ đồ chức năng Hình 3.11 – Sơ đồ chức năng của module Các bảng dữ liệu Hình 3.12 – Bảng Newsletters Với việc thông tin về người đăng kí nhận thư có thể sử dụng các bảng trong module hồ sơ và thành viên thì với module này chỉ cần một bảng Newsletters thể hiện nội dung thư gửi từ hệ thống, và các thông tin về thư đó. Thiết kế lớp cấu hình cho module Module này sử dụng thành phần nằm trong của tệp web.config . Để cấu hình cho module ta phải xem các thành phần cấu hình của // ở bảng sau Thuộc tính SMTP Mô tả DeliveryMethod Thiết lập thuộc tính này với “network” chỉ ra cho ứng dụng biết rằng có một mảy chủ thư điện tử bên ngoài sẽ được sử dụng để gửi thư điện tử. Để gửi được thư thì thành phần của cần được sử dụng gồm có Nơi chứa - Host,Cổng - Port,Tên người dùng - UserName,Mật khẩu- Password, và Chứng thực mặc định - DefaultCredentials. From Chỉ ra địa chỉ email sẽ được đặt trong mục “From” khi ứng dụng gửi thư đi ConfigSource Định nghĩa một nguồn ngoài cho các thiết lập cấu hình thư ví dụ như mail.config Tiếp đến là cấu hình /// Thuộc tính Network Mô tả DefaultCredentials Một giá trị kiểu bool chỉ ra rằng các chứng thực của ứng dụng có được dùng hay không. Nếu giá trị đó là true thì UserName và Password là không cần Host Tên của máy chủ thư điện tử UserName Tên người dùng được sử dụng để đăng nhập vào máy chủ thư điện tử và gửi thư. Password Mật khẩu được sử dụng để đăng nhập vào máy chủ thư điện tử để gửi thư Port Cổng sẽ được sử dụng để gửi SMTP Cuối cùng ta sẽ tạo thêm phần cấu hình cho module . Phần này thiết lập địa chỉ thư điện tử được sử dụng để gửi thư Thuộc tính Newsletters Mô tả FromEmail Địa chỉ thư điện tử thực sẽ xuất hiện trong mục “From” trong thư gửi đi ở phần đầu của thư FromDisplayName Tên hiển thị được sử dụng kèm với thuộc tính FromEmail Model Với module này ta sẽ chỉ cần model là lớp thực thể LINQ-to-SQL dưới đây: Hình 3.13 – Sơ đồ Model Newsletter Controller Với các chức năng của module như sơ đồ chức năng ta có tương ứng các phương thức hành động của controller của module Phương thức hành động Bảo mật Các tham số Index ---- ---- ManageNewsletters Editor ---- UpdateStatus Editor ---- CreateNewletters Editor string subject , string body EditNewsletters Editor int? newsletterId, string subject, string body RemoveNewsletter Editor int? newsletterId View Từ các phương thức hành động trong phần controller ta cũng có các view dành cho tương ứng . Dưới đây là danh sách các view của module Tên trang Đặc tả Đường dẫn ảo Index.aspx Trang này được sử dụng để đăng kí nhận thư từ hệ thống newsletter CreateNewsletter.aspx Trang này cho phép người dùng với vai trò là editor tạo hoặc chỉnh sửa thư editor/newsletter/create editor/newsletter/edit/{newsletterId} ManageNewsletter.aspx Trang này liệt kê toàn bộ các thư đã gửi trước đó. Editor có thể nhấn vào thư và xem lại nội dung thư hoặc xóa thư. Trang được cập nhật sau vài giây xử dụng JQuery editor/newsletter/remove/{newsletterId} editor/newsletter Cấu hình định tuyến Định tuyến cho trang index của module: routes.MapRoute( "NewsletterIndex", "newsletters", new { controller = "Newsletter", action = "Index" } ); Định tuyến cho các trang dành cho editor: routes.MapRoute( "NewsletterCreate", "editor/newsletters/create", new { controller = "Newsletter", action = "CreateNewsletter" } ); routes.MapRoute( "NewsletterEdit", "editor/newsletters/edit/{newsletterId}", new { controller = "Newsletter", action = "EditNewsletter", newsletterId = (int?)null }, new { newsletterId = "[0-9]+" } ); routes.MapRoute( "NewsletterRemove", "editor/newsletters/remove/{newsletterId}", new { controller = "Newsletter", action = "RemoveNewsletter", newsletterId = (int?)null }, new { newsletterId = "[0-9]+" } ); routes.MapRoute( "NewsletterManage", "admin/newsletters", new { controller = "Newsletter", action = "ManageNewsletters" } ); MODULE LẤY Ý KIẾN KHÁCH HÀNG Tổng quan về module Module lấy ý kiến khách hàng gồm các câu hỏi đi kèm với mỗi câu hỏi là các lựa chọn mà khách hàng có thể chọn để trả lời câu hỏi đó. Module được xây dựng vì những lí do như người quản lí hệ thống muốn nắm bắt thị hiếu khách hàng về nhiều vấn đề từ hệ thống cho đến các sản phẩm bán trong siêu thị …Ngoài ra module được xây dựng cũng đem lại cho khách hàng cảm giác họ là một phần của hệ thống và như vậy họ sẽ sử dụng hệ thống thường xuyên hơn. Về mặt chức năng thì module sẽ cho người dùng xem các chưng cầu có trong hệ thống (polls) , cho ý kiến (vote) . Với người dùng có vai trò là editor có thể quản lí các chưng cầu (chuyển chưng cầu sang trạng thái đã lấy đủ ý kiến - archive, hiện hành, chỉnh sửa chưng cầu, xóa chưng cầu) , tạo chưng cầu mới Sơ đồ chức năng Hình 3.14 – Sơ đồ chức năng của module lấy ý kiến người dùng Các bảng dữ liệu Hình 3.15 – Sơ đồ mối quan hệ giữa 2 bảng DL của module lấy ý kiến người dùng Với module này ta cần 2 bảng một bảng là bảng Polls chứa các câu hỏi lấy ý kiến và các thuộc tính của chúng như câu hỏi chưng cầu là hiện hành – current , hay đã lấy đủ ý kiến – archived… Bảng thứ 2 là bảng PollOptions chứa các thông tin về những chọn lựa cho câu hỏi đặt ra để lấy ý kiến. Mỗi một chọn lựa – options tương ứng với một câu trả lời được hệ thống tạo sẵn cho người dùng.Quan hệ giữa 2 bảng này được tạo thông qua khóa ngoại PollID Hình 3.16 – Sơ đồ thiết kế bảng PollOptions Hình 3.17 – Sơ đồ thiết kế bảng Polls Thiết kế lớp cấu hình cho module Với module này cần thiết lập một số thông tin cấu hình như thiết lập thuộc tính archived hay public cho một chưng cầu … (khi thiết lập thuộc tính public hay archived cho poll, cho phép hay không cho phép vote nhiều lần ..) Bảng dưới đây sẽ là bảng các thuộc tính thuộc lớp PollElement . Lớp này kế thừa từ lớp ConfigurationElement của framework .net mvc. Nó sẽ đọc các thiết lập của thành phần nằm trong phần thiết lập cầu hình của trong tệp web.config Thuộc tính SMTP Mô tả VotingLockInterval Một số nguyên cho biết khi nào thì cookie dành cho phần vote của một người dùng cụ thể nào đó hết hiệu lực (tương ứng với số ngày ngăn ngừa việc vote lại) VotingLockByCookie Một giá trị kiểu bool chỉ ra rằng liệu cookie có được dùng hay không được dùng cho việc nhớ người dùng đã vote hay chưa VotingLockByIP Một giá trị kiểu bool cho biết liệu địa chỉ IP của người dùng có được giữ trong bộ nhớ để tránh việc một người với cùng 1 địa chỉ IP trong phiên hiện hành vote cho cùng một poll nhiều lần ArchiveIsPublic Một giá trị kiểu bool được dùng để cho biết liệu các poll đã được thiết lập archive có được xem bởi tất cả mọi người hay không Model Model của module này cũng thiết kế theo kiểu mẫu Provider Model của Microsoft như đã trình bày trong phần lựa chọn kiến trúc hệ thống. Có 2 lớp thực thể LINQ-to-SQL được tạo tự động là: Hình 3.18 – Sơ đồ lớp PollOption và Poll Lớp tĩnh PollQueries chứa tất cả các truy vấn cần thiết để lấy thông tin từ CSDL cụ thể nó cung cấp các phương thức mở rộng cho module này. Hình 3.19 – Sơ đồ lớp PollQueries Controller Ứng với các chức năng của module ta có các phương thức hành động trong controller của module ở bảng dưới đây Phương thức hành động Bảo mật Các tham số Index ---- bool? archived, int page ViewPoll ---- int id, string path Vote ---- int optionId ManagePolls Editor int page CreatePoll Editor string question, bool? Current RemovePoll Editor int? newsletterId EditPoll Editor int pollId, string question, bool? current, bool? Archived AddOption Editor int pollId, string text RemoveOption Editor int optionId SetCurrent Editor int pollId SetArchived Editor int pollId, bool archive View Dưới đây là các trang – view của module dành cho người dùng có vai trò editor và người dùng khác của hệ thống: Tên trang Đặc tả Đường dẫn ảo Index.aspx Trang này được sử dụng để xem các poll ở các trạng thái như công khai (public) , đã lấy đủ (archived) /polls /polls/page{page} /polls?archived=true /polls/ page{page}?archived=true CreatePoll.aspx Trang này cho phép người dùng với vai trò là editor tạo hoặc chỉnh sửa poll /editor/polls/create / editor /polls/edit/{pollId} ManagePolls.aspx Trang này liệt kê toàn bộ các poll có trong hệ thống. Editor có thể thêm, chỉnh sửa, xóa các lựa chọn của poll, thiết lập poll hiện hành (set current), và xem poll hiện hành / editor /polls / editor /polls/page{page} RemovePoll.aspx Trang này dùng thực hiện việc xóa poll khỏi hệ thống /editor/polls/remove/{pollId} Sử dụng javascript Module này sử dụng 2 tệp javascript trong thư mục Content/script là tệp manage-poll.js : /****************************************************************** * Manage ******************************************************************/ $(document).ready(function() { $("#polls :input").hide("fast"); }); $(".set-current").click(function() { var id = $(this).attr("meta:id"); $.post( "/poll/setcurrent", { pollId: id }, function(data) { var poll = $("#set-current-" + data.object.pollId); poll.remove(); }, "json" ); return false; }); $(".set-archived").click(function() { var id = $(this).attr("meta:id"), archived = $(this).hasClass("archived"); $.post( "/poll/setarchived", { pollId: id, archive: !archived }, function(data) { var poll = $("#set-archived-" + data.object.pollId); poll.removeClass("archived"); if (data.object.isArchived) poll.addClass("archived"); poll.text(data.object.isArchived ? "Allow Voting" : "Archive"); }, "json" ); return false; }); /****************************************************************** * Polls ******************************************************************/ $("#question").focus(function() { ShowMessage(this, "Enter the question you would like to ask in the poll."); }); function ValidateQuestion() { return VerifyRequiredField("#question", "required"); } function ValidatePoll() { return ValidateQuestion(); } $("form.poll-create").validate(ValidatePoll); function EditOption() { var id = $(this).attr("meta:id"), option = $("#option-" + id), text = option.find(".text").text(); // hide all the childrend option.children().hide(); var optionForm = $(" Update Cancel"); // update the form optionForm.find(".update").click(function () { var id = $(this).attr("meta:id"), formText = $(this).prevAll(".edit-text").val(); $.post( "/poll/editoption", { optionId: id, text: formText }, function (data) { var comment = $("#option-" + data.object.optionId); comment.children("form").remove(); comment.children(".text").text(data.object.text); comment.children().show(); }, "json" ); }); // cancel the update optionForm.find(".cancel").click(function () { $(this).parents(".option").children(":hidden").show(); $(this).parents("form").remove(); }); // add the form to the current comment option.append(optionForm); return false; } $(".edit-option-button").click(EditOption); function DeleteOption () { var id = $(this).attr("meta:id"); $.post( "/poll/removeoption", { optionId: id }, function (data) { $("#option-" + data.object.optionId).fadeOut("slow", function () { $(this).remove() }); }, "json" ); return false; } $(".delete-option-button").click(DeleteOption); function AddOptionSuccess(data) { var optionItem = $("" + data.object.text + " Edit Delete"); op

Các file đính kèm theo tài liệu này:

  • docTìm hiểu và xây dựng ứng dụng web siêu thị trực tuyến với ASPNET MVC.doc