thuộc nhiều nhóm bài viết.
STT Tên trường Kiểu dữ liệu Mô tả
1 ContentID INT Khóa chính, mã bài viết
2 Version INT Khóa chính, phiên bản bài viết
3 ZoneID INT Khóa chính, mã nhóm bài viết
4 Ranking INT Cấp độ bài viết
5 ModifiedDate DATETIME Ngày thay đổi thông tin cuối cùng 6 CreationDate DATETIME Ngày tạo phân phối
Bảng 3.8: Thiết kế bảng Distribution
Hình 3.7: Lược đồ CSDL
3.3. Xây dựng các thành phần ứng dụng
3.3.1. Mô hình dữ liệu đối tượng sử dụng Table Storage
Ở ứng dụng này, ta sẽ sử dụng mô hình dữ liệu Table Storage của Windows Azure để tạo ra cấu trúc bảng dữ liệu (xem chương 2, phần 2.2.1.2 Dịch vụ Storage ), các bảng sẽ được thể hiện thông qua các lớp đối tượng (class) với các trường tương ứng là các thuộc tính của lớp. Cũng tương tự, các hàm (function), thủ tục lưu (stored procedure) sẽ được cài đặt như là các phương thức của lớp.
Các lớp này đều thừa kế từ lớp TableServiceEntity định nghĩa trong namespace Microsoft.WindowsAzure.StorageClient. Khi WebRole được khởi tạo, chương trình sẽ dựa trên khai báo của lớp để tạo nên mô hình dữ liệu tương ứng trên Tabl Storage, thao tác này chỉ thực hiện một lần.
Ví dụ:
// lay the hien doi tuong Storage Account thong qua chuoi ket noi var account =
CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
// tao table Accounts tu mo hinh du lieu khai bao trong AccountContext
CloudTableClient.CreateTablesFromModel(typeof(AccountContex t),
account.TableEndpoin t.AbsoluteUri, account.Credentials);
// khoi tao du lieu cho bang Account
...
Sau đây là mô tả các lớp đối tượng và các phương thức tương ứng:
• Lớp Account:
public class Account :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: AccountID
public int AccountID { get; set; } public string UserName { get; set; } public string Password { get; set; } public string Email { get; set; }
public DateTime ModifiedDate { get; set; } public DateTime CreationDate { get; set; }
// constructor
public AccountContext(string baseAddress, StorageCredentials credentials): base(baseAddress, credentials);
public void Insert(string username, string password, string email);
// cap nhat thong tin user
public void Update(int accountID, string username, string password,
string email); // xoa 1 user
public void Remove(int accountID); // get Accounts
public List<Account> GetAccounts(); // tra lai doi tuong Account tu AccountID
public Account GetAccountForID(int accountID); public int GetAccountID(string username);
// kiem tra co ton tai Account thong qua AccountID
public bool Exist(int accountID);
// xac thuc tai khoan
public bool Authenticated(string username, string password);
• Lớp AccountProperty
public class AccountProperty :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: AccountID, Property
public int AccountID { get; set; } public string Property { get; set; } public string Value { get; set; }
public DateTime ModifiedDate { get; set; } public DateTime CreationDate { get; set; }
// tao account property moi
public void Insert(int accountID, string property, string value) ;
// cap nhat mot account property
public void Update(int accountID, string property, string value);
// xoa cac account property co cung AccountID = accountID
public void Remove(int accountID);
// xoa mot account property
public void RemoveProperty(int accountID, string property);
// lay value cua 1 account property
public string GetValue(int accountID, string property);
• Lớp AccountRole
public class AccountRole :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: AccountID, Role
public int AccountID { get; set; } public string Role { get; set; }
public DateTime CreationDate { get; set; }
// them moi 1 account role
public void Insert(int accountID, string role);
// xoa bo account role
public void Remove(int accountID);
// get all role
public List<AccountRole> GetAllRole(string role);
// get all role cho 1 accID
public List<AccountRole> GetRolesForID(int accountID);
// kiem tra quyen cho 1 user
public bool Authorization(ArrayList roles, string username, CloudStorageAccount strAccount);
• Lớp Content
public class Content :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: ContentID, Version
// foreign key: ByLine --> Account.AccountID
// foreign key: UpdateUserID --> Account.AccountID
public int ContentID { get; set; } public int Version { get; set; } public int Protected { get; set; } public string Headline { get; set; } public string Source { get; set; } public int Byline { get; set; } public string Teaser { get; set; } public string Body { get; set; } public string TagLine { get; set; } public int Status { get; set; } public int Editor { get; set; } public int Approver { get; set; } public int UpdateUserID { get; set; } public DateTime ModifiedDate { get; set; } public DateTime CreationDate { get; set; }
// tao ContentID moi = MAX(ContentID) + 1
// them 1 Content moi
public void Insert(int contentID, int version, int isProtected,
string headline, string source, int byline, string teaser, string
body, string tagline, int editor, int approver, int updUserID,
int status);
// overload
public void Insert(string headline, string source, int byline,
string teaser, string body, string tagline);
// cap nhat thong tin 1 Content
public void Update(int contentID, int version, int isProtected,
string headline, string source, int byline, string teaser, string
body, string tagline, int editor, int approver, int updUserID,
int status);
// set status bai viet
public void SetStatus(int contentID, int version, int status);
// set editor
public void SetEditor(int contentID, int version, int editor);
public void SetApproval(int contentID, int version, int approver);
public void SetProtected(int contentID, int version, int
isProtected);
public List<Content> GetHeadlines();
public List<Content> GetHeadlinesForAuth(int byLine); public List<Content> GetHeadlinesForEdit(int editor); public List<Content> GetHeadlinesForApprove(int approver); public List<Content> GetContentForID(int cid);
public Content GetContentForIDVer(int cid, int ver); public void Remove(int cid, int ver);
• Lớp ContentRank
public class ContentRank :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: RankID
public int RankID { get; set; } public string Rank { get; set; }
public List<ContentRank> GetRanks(); public int GetRankID(string rank);
• Lớp Distribution
public class Distribution :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: ContentID, Version, ZoneID
public int ContentID { get; set; } public int Version { get; set; } public int ZoneID { get; set; } public int Ranking { get; set; }
public DateTime ModifiedDate { get; set; } public DateTime CreationDate { get; set; }
public void Insert(int contentID, int version, int zoneID, int
ranking);
public List<Distribution> GetOrdered(int zoneID);
public void UpdateRank(int zoneID, int contentID, int version, int
ranking);
public void Remove(int cid, int ver);
• Lớp Domain
public class Domain :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: DomainID
public int DomainID { get; set; } public string DomainType { get; set; } public int Protected { get; set; } public string Title { get; set; }
public string Description { get; set; } public DateTime ModifiedDate { get; set; } public DateTime Creationdate { get; set; }
public List<Domain> GetAll()
public List<Domain> GetDomainForID(int did)
• Lớp Role
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: RoleID
public int RoleID { get; set; } public string RoleName { get; set; }
public List<Role> AllRoles()
• Lớp Zone
public class Zone :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity {
// primary key: ZoneID
// foreign key: DomainID --> Domain.DomainID
public int ZoneID { get; set; } public int Protected { get; set; } public string Title { get; set; }
public string Description { get; set; } public int DomainID { get; set; }
public DateTime ModifiedDate { get; set; } public DateTime CreationDate { get; set; }
public List<Zone> GetZonesForDomain(int domainID) public Zone GetZone(int zoneID)
public bool isProtected(int zoneID)
3.3.2 Xây dựng các phân hệ
Hệ thống bao gồm 5 phân hệ chính: Authoring (Viết bài), Editing (Biên tập), Approving (Phê duyệt), Deploying (Triển khai) và Quản lý tài khoản. Mỗi nhóm người dùng sẽ có thể sử dụng các tính năng của phân hệ với quyền tương ứng. Các phân hệ được thiết kế tương ứng với các trường hợp sử dụng.
• Phân hệ Authoring
Phân hệ Author gồm các form và tính năng:
- Form tạo bài viết mới với giao diện trực quan
- Form chỉnh sửa bài viết (trước khi submit) - Lưu bài viết theo các phiên bản.
- Xem danh sách các bài viết của mình - Submit bài viết lên nhóm biên tập (editor)
Người dùng thuộc nhóm Editor có thể thực hiện các chức năng biên tập trong phân hệ này, bao gồm:
- Xem danh sách các bài viết được người dùng nhóm Author đưa lên - Chỉnh sửa các bài viết
- Lưu bài viết theo các phiên bản
- Trả lại bài viết cho tác giả (Author) để chỉnh sửa lịa - Từ chối biên tập (Editor khác có thể nhận biên tập) - Submit bài viết lên để phê duyệt (approve)
• Phân hệ Approving
Các tính năng trong phân hệ này:
- Xem danh sách bài viết đã được biên tập
- Duyệt bài viết lên nhóm Deployer - Trả lại bài viết để biên tập lại
• Phân hệ Deploying
Các tính năng trong phân hệ này
- Xem danh sách bài viết đã được phê duyệt - Triển khai bài viết vào một nhóm bài viết (Zone) - Xem danh sách bài viết đã được triển khai
- Đưa 1 bài viết đã được triển khai về trạng thái lưu trữ (archive) - Trả lại bài viết để sửa lại
• Phân hệ quản lý tài khoản:
Phân hệ này cho phép Administrator thực hiện các thao tác - Xem danh sách tài khoản người dùng - Xem thông tin tài khoản người dùng - Sửa thông tin tài khoản người dùng - Tạo tài khoản mới
- Xóa tài khoản người dùng
Người dùng cũng có thể sử dụng phân hệ này để xem và sửa thông tin cá nhân.
Kết chương
Như vậy chương này đã đưa ra khái niệm về hệ thống quản trị nội dung cùng với những lợi ích mà nó đem lại, mô tả các yêu cầu cơ bản để xây dựng một hệ thống quản trị nội
dung, mô hình hệ quản trị nội dung xây dựng trên môi trường Windows Azure, mô hình các chức năng và dữ liệu.
Ở chương tiếp theo, chúng ta sẽ khảo sát kết quả thử nghiệm hệ thống và đánh giá.
CHƯƠNG 4: THỬ NGHIỆM VÀ ĐÁNH GIÁ
4.1. Triển khai hệ thống lên Windows Azure
Một số hình ảnh của hệ thống và cách sử dụng:
Hình 4.1: Upload gói mã nguồn (*.cspkg) và file cấu hình (*.cscfg) lên môi trường Staging Deployment của Hosted Service
Hình 4.2: Tạo Storage Account, thu được Primary Key Access và Endpoints
• Cấu hình Hosted Services
Hình 4.3: Cấu hình số instances, khai báo Storage Account Key
Hình 4.4: Test hệ thống trong môi trường Staging
• Deploy hệ thống sang môi trường Production
Hình 4.5: Deploy hệ thống sang môi trường Production
Hình 4.6: Thế hiện nội dung bài viết
• Giao diện quản trị (Author)
Hình 4.7: Phần quản trị: Author xem danh sách bài viết
Hình 4.8: Author viết bài
• Biên tập
Hình 4.9: Editor biên tập bài viết
Hình 4.10: Phê duyệt bài viết
• Triển khai bài viết
Hình 4.11: Deployer triển khai bài viết
Hình 4.12: Quản lý tài khoản - Danh sách tài khoản
Hình 4.13: Quản lý tài khoản – Tạo tài khoản mới
4.2. Đánh giá hệ thống
Hệ thống CloudCMS về mặt cơ bản đã đáp ứng được những yêu cầu cho một hệ thống quản trị nội dung, ưu điểm của hệ thống:
• Giao diện trực quan để thực hiện các công việc: Viết bài, Biên tập, Duyệt bài, Triển khai
• Cho phép quản lý bài viết theo phiên bản
• Khả năng quản lý tài khoản và giới hạn tài khoản người dùng.
• Sử dụng Windows Azure Storage Service để lưu trữ dữ liệu bài viết, qua đó giảm được chi phí sử dụng SQL Azure và tăng tính linh hoạt cho hệ thống.
Tuy nhiên, để có thể triển khai thành một CMS chuyên nghiệp, hiệu quả hệ thống còn một số nhược điểm:
• Khả năng tùy biến giao diện còn hạn chế
• Chỉ phù hợp với những trang web quy mô vừa và nhỏ
• Chi phí tính toán trên Windows Azure còn tương đối cao.
Kết chương
Như vậy chương này đã giới thiệu quá trình từ triển khai ứng dụng lên môi trường Windows Azure Platform, thử nghiệm quy trình hệ thống với các tính năng Viết bài, Biên tập, Duyệt bài và Triển khai. Hệ thống về cơ bản đã hoạt động ổn định trên môi trường Windows Azure (với tên miền http://cloudcms.cloudapp.net). Chương này cũng đưa ra nhận xét, đánh giá về những ưu điểm và nhược điểm của hệ thống.
TÀI LIỆU THAM KHẢO
Các tài liệu, bài báo khoa học
[1] Cloud Computing, A Seminar Report -Maheswaran.M [2] Introduction to Cloud Computing - Sun MicroSystems
[3] Architectural Strategies for Cloud Computing - Oracle White Paper
[4] Introducing the Windows Azure Platform, v1.2 – Chappell - Microsoft White Paper
[5] Introducing Windows Azure - David Chappell - Microsoft White Paper March 09
[6] An Introduction to Windows Azure Platform AppFabric for Developers - Microsoft
[7] Real World ASP.NET: Building a Content Management System - Stephen Fraser – Appress 2002
Các trang web
[8] IBM http://www.ibm.com
[9] Microsoft Windows Azure Homepage http://microsoft.com/windowsazure
[10]Ecomworld http://ecomworld.com
[11]http://infreemation.net
[12]www. forrester .com/