Luận văn Áp dụng mô hình MVC của Công ty cổ phần công nghệ thanh toán Việt Nam (Vinapay)

Tất nhiên, sử dụng MVC model 2 một cách hoàn toàn cứng nhắc, phần “Điều khiển” chỉ dùng servlet, phần “Hiển thị” chỉ dùng JSP sẽ dãn đến một vài trường hợp kém hiệu quả, nhất là khi các yêu cầu từ trình duyệt web chỉ đòi hỏi việc hiển thị thông tin. Trong trường hợp này, gửi thẳng yêu cầu hiển thị từ trình duyệt web tới trang JSP sẽ hiệu quả hơn. Trong cách áp dụng MVC này, các yêu cầu có liên quan đến logic chương trình hoặc truy cập dữ liệu sẽ gửi tới servlet controller, còn các yêu cầu chỉ liên quan tới hiển thị sẽ được gửi tới JSP controller.

pdf57 trang | Chia sẻ: lylyngoc | Lượt xem: 2418 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Luận văn Áp dụng mô hình MVC của Công ty cổ phần công nghệ thanh toán Việt Nam (Vinapay), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ệu hay từ các hệ thống ứng dụng khác (như mail…). -View (tạm dịch là phần “Hiển thị”): Là phần giao diện với người dùng, bao gồm việc hiện dữ liệu ra màn hình, cung cấp các menu, nút bấm, hộp đối thoại, chọn lựu…, để người dùng có thể thêm, xóa, sửa, tìm kiếm và làm các thao tác khác đối với dữ liệu trong hệ thống. -Controller (tạm dịch là phần “Điều khiển”): Là phần điều khiển toàn bộ logic về hoạt động của giao diện, tương tác với thao tác của người dùng (từ chuột, bàn phím và các thiết bị ngoại vi khác) và cập nhật, thao tác trên dữ liệu theo đầu vào nhận được và điều khiển việc chọn phần “Hiển thị” thích hợp để truyền dữ liệu tới người dùng. -Với phương pháp thiết kế này, các chức năng hiển thị, chức năng logic điều khiển và chức năng truy cập dữ liệu của chương trình được chia thành các phần riêng biệt. Java là một ngôn ngữ lập trình hướng đối tượng 10 thuần túy nên việc áp dụng MVC vào các phần mếm viết bằng Java rất dễ dàng và thuận tiện. Có hai hình mẫu chính của phương pháp thiết kế MVC trong Java là MVC model 1 và MVC model 2.Trong MVC model 1, các trang JSP đóng vai trò “Hiển thị” (View) và “Điều khiển” (Controller). Có thể có nhiều trang JSP khác nhau đóng các vai trò khác nhau. -Thao tác của người dùng trên trình duyệt web được gửi tới một trang JSP. Trang JSP này sẽ khởi tạo một hoặc nhiều Java Bean (nếu cần thiết), truyền các lệnh cần thi hành tới Java Bean (không phải Enterprise Java Bean). -Sau khi Java Bean thực hiện xong việc truy xuất hoặc cập nhập dữ liệu, trang JSP ban đầu có thể hiển thị dữ liệu lấy từ Bean (JSP ban đầu đóng luôn vai trò View), hoặc chọn một trang JSP khác để hiện dữ liệu từ Bean (JSP ban đầu đóng luôn vai trò Controller). Trong một thiết kế tốt, để đảm bảo việc tách rời phần trình bày và logic của chương trình, trang JSP nhận yêu cầu chỉ đóng vai trò “Điều khiển” (Contronller). -MVC model 1 có một nhược điểm là phần logic điều khiển được viết trong trang JSP, như vậy phần chương trình Java phức tạp dùng để điều khiển sẽ bị lẫn vào trong mã HTML dùng để trình bày. Độ phức tạp của chương trình càng cao, thì trang JSP càng khó phát triển và bảo trì. Hơn nữa, trong các dự án phức tạp, phần hiển thị do người thiết kế web giỏi về HTML và đồ họa thực hiện, còn phần điều khiển được người chuyên về lập trình thực hiện. Dùng JSP làm phần điều khiển sẽ khó phân ranh giới trách nhiệm giữa nhóm thiết kế đồ họa và nhóm lập trình. Để khắc phục nhược điểm này, MVC model 2 ra đời. Trong MVC model 2, một hoặc nhiều servlet (thường là một) đóng vai trò điều khiển, các Java Bean đóng vai trò mô hình và các trang JSP đóng vai trò hiển thị. 11 -Trong model 2, các logic phức tạp của chương trình được viết hoàn toàn trong các servlet (chương trình Java). Phần hiển thị chỉ gồm các trang JSP với một vài mã đơn giản để lấy dữ liệu có sẵn, không có logic phức tạp, vì thế hoàn toàn có thể giao cho người thiết kế web. Các yêu cầu của người dùng được gửi từ trình duyệt web tới servlet. Servlet sẽ khởi tạo Java Bean (nếu cần thiết), ra lệnh thu nhập, cập nhập thông tin. Khi Java Bean hoàn thành công việc, servlet sẽ chọn trang JSP thích hợp để hiện thông tin trong Java Bean cho người dùng. Đây là cách sử dụng MVC rất hiệu quả trong Java. Tất nhiên, sử dụng MVC model 2 một cách hoàn toàn cứng nhắc, phần “Điều khiển” chỉ dùng servlet, phần “Hiển thị” chỉ dùng JSP sẽ dãn đến một vài trường hợp kém hiệu quả, nhất là khi các yêu cầu từ trình duyệt web chỉ đòi hỏi việc hiển thị thông tin. Trong trường hợp này, gửi thẳng yêu cầu hiển thị từ trình duyệt web tới trang JSP sẽ hiệu quả hơn. Trong cách áp dụng MVC này, các yêu cầu có liên quan đến logic chương trình hoặc truy cập dữ liệu sẽ gửi tới servlet controller, còn các yêu cầu chỉ liên quan tới hiển thị sẽ được gửi tới JSP controller. 12 CHƯƠNG III.PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG I. Giới thiệu : -Phân tích và thiết kế hệ thống nhằm hiểu rõ chu kỳ phát triển hệ thống, nghiên cứu sơ bộ, mô hình hóa yêu cầu, dữ liệu và quá trình, mô hình hóa đối tượng, thiết kế nhập xuất và giao diện người sử dụng, thiết kế dữ liệu, kiến trúc ứng dụng, thực hiện, cài đặt, vận hành và hỗ trợ hệ thống. II. Phân tích hệ thống theo Chức năng 1.Quản lý người dùng -Là chức năng quản lý người dùng hay đăng nhập vào hệ thống, với mỗi user này đều có username và password riêng. Quản lý người dùng(user) gồm 2 chức năng chính: a. Hiển thị danh sách người dùng b. Thêm, Sửa, Xoá người dùng. 13 2.Quản lý thư mục - Là chức năng quản lý thư mục của hệ thống, mỗi thư mục là một chức năng riêng, có một đường liên kết tới chức năng của thư mục đó. Quản lý thư mục gồm 2 chức năng chính: a. Hiển thị danh sách thư mục. b. Thêm, Sửa, Xoá thư mục. 3.Quản lý Phân quyền -Là chức năng phân quyền người dùng, chức năng này phụ thuộc vào 2 đối tượng “Người dùng” và “Thư mục”. Mỗi người dùng sẽ sử dụng một số các thư mục, các thư mục khác không có quyền sử dụng sẽ không được hiên ra trên giao diện người dùng. Phân quyền gồm 2 chức năng chính: a. Hiện thị danh sách Phân Quyền. b. Thêm sửa xoá Phần Quyền với Người Dùng. 4.Quản lý Nhân viên -Là chức năng chính trong hệ thống, quản lý nhân sự trong doanh nghiệp vinapay. Gồm 2 chức năng chính: a. Hiển thị danh sách nhân viên. b. Thêm, sửa, xoá nhân viên. III. Phân tích hệ thống theo sơ đồ luồng dữ liệu 1.Sơ đồ luồng dữ liệu mức ngữ cảnh 14 2.Sơ đồ luồng dữ liệu mức đỉnh : 15 3.Sơ đồ luồng dữ liệu mức dưới đỉnh: a. Chức năng quản lý người dùng: Hiển thị danh sách Người Dùng Thêm, Sửa, Xoá Người Dùng Người dùng Yêu cầu Người dùng User, Password ID,User,Pass ID Nguoi dung Báo cáo User, Password Phân Quyền b. Chức năng quản lý thư mục Hiển thị danh sách Thư mục Thêm, Sửa, Xoá Thư mục Người dùng Yêu cầu ID,Tên,liênkết ID,Tên, liênkết ID Thư mục Báo cáo ID,Tên,Liên kết Phân Quyền Thư mục 16 c. Chức năng phân quyền: d. Chức năng quản lý Nhân viên: 17 4.Sơ đồ luồng dữ liệu tổng quát: -Quản lý tài khoản của nhân viên trong công ty. 18 -Quản lý nhân viên trong công ty: VI.Các bảng cơ sở dữ liệu dùng trong chương trình: a.Bảng Tài khoản : 19 b.Bảng Thư mục_Tài khoản : c.Bảng Nhân viên : 20 d.Bảng Thư mục: 21 CHƯƠNG IV.CẤU TRÚC CHƯƠNG TRÌNH ĐƯỢC ÁP DỤNG MÔ HÌNH MVC Chương trình được cấu trúc gồm 3 phần,đúng với cấu trúc của mô hình MVC,gồm các phần như sau: I.View(Interface_Hiển thị): 1.Truy cập vào web: *Login: -phần này người quản lý hệ thống dùng để đăng nhập vào chương trình: *Giao diện: 22 *code: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class Interface_AccessWebsite_login : System.Web.UI.Page { private AccountDB objAccountDB = new AccountDB(); protected void Page_Load(object sender, EventArgs e) { } public string GetApplicationPath() { string applicationPath = ""; if (this.Page.Request.Url != null) applicationPath = this.Page.Request.Url.AbsoluteUri.Substring( 0, this.Request.Url.AbsoluteUri.ToLower().IndexOf( this.Request.ApplicationPath.ToLower(), this.Request.Url.AbsoluteUri.ToLower().IndexOf( this.Page.Request.Url.Authority.ToLower()) + this.Page.Request.Url.Authority.Length) + this.Request.ApplicationPath.Length); return applicationPath; } protected void btnLogin_Click(object sender, EventArgs e) { string strUsername = this.txtUsername.Text; string strPassword = this.txtPassword.Text; AccountDetails objAccountDetails = new AccountDetails(strUsername, strPassword); int intCount = objAccountDB.CheckAccount(objAccountDetails); Session["sesUsername"] = strUsername; Session["sesPassword"] = strPassword; if (intCount == -1) { Response.Write(objAccountDB.ErrorDetail); 23 Response.Write(""); return; } if (intCount != 0) { Response.Redirect(GetApplicationPath() + "/Interface/home.aspx?page=interface/wellcome.aspx"); } Response.Write("don't access right!"); } } a.Danh sách tài khoản: *Giao diện: 24 Code: using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class Interface_AccessWebsite_AccountList : System.Web.UI.Page { private AccountDB objAccountDB = new AccountDB(); private AccountDetails[] arrAccountDetails; protected void Page_Load(object sender, EventArgs e) { arrAccountDetails = objAccountDB.GetAllAccounts(); this.grdAccounts.DataSource = arrAccountDetails; grdAccounts.DataBind(); } protected string GetApplicationPath() { string applicationPath = ""; if (this.Page.Request.Url != null) applicationPath = this.Page.Request.Url.AbsoluteUri.Substring( 0, this.Request.Url.AbsoluteUri.ToLower().IndexOf( this.Request.ApplicationPath.ToLower(), this.Request.Url.AbsoluteUri.ToLower().IndexOf( this.Page.Request.Url.Authority.ToLower()) + this.Page.Request.Url.Authority.Length) + this.Request.ApplicationPath.Length); return applicationPath; } protected void grdAccounts_SelectedIndexChanged(object sender, EventArgs e) { 25 } } b.Thay đổi Mật mã: *Giao diện: *Code: public partial class Interface_AccessWebsite_ChangPassword : System.Web.UI.Page { private AccountDB objAccountDB = new AccountDB(); private AccountDetails objAccountDetails = new AccountDetails(); protected void Page_Load(object sender, EventArgs e) { } public string GetApplicationPath() { string applicationPath = ""; if (this.Page.Request.Url != null) applicationPath = this.Page.Request.Url.AbsoluteUri.Substring( 0, this.Request.Url.AbsoluteUri.ToLower().IndexOf( 26 this.Request.ApplicationPath.ToLower(), this.Request.Url.AbsoluteUri.ToLower().IndexOf( this.Page.Request.Url.Authority.ToLower()) + this.Page.Request.Url.Authority.Length) + this.Request.ApplicationPath.Length); return applicationPath; } protected void btnChange_Click(object sender, EventArgs e) { // Check suitable between Password and ConfirmPassword if (this.txtConfirmPassword.Text != this.txtPassword.Text) { this.lblMessage.Text = "Password anh confirm is suitable!"; return; } // Change Password objAccountDetails.Username = (string)Session["sesUsername"]; objAccountDetails.Password = this.txtPassword.Text; int intError = objAccountDB.ChangePassword(objAccountDetails); // check blank pass //if (objAccountDB.ChangePassword(objAccountDetails) == 1 ) //{ // check error if (intError == 0) { this.lblMessage.Text = "Don't use blank password"; return; } else { this.lblMessage.Text = "Password chage successfully!"; return; } } } c.Tạo người dùng mới: *Giao diện: 27 *Code: public partial class Interface_AccessWebsite_CreateUser : System.Web.UI.Page { private AccountDB accdb = new AccountDB(); private AccountDetails accdetail = new AccountDetails(); private Common objCommon = new Common(); protected void Page_Load(object sender, EventArgs e) { } protected void Accept_Click(object sender, EventArgs e) { string _username = this.txtUsername.Text; string _password = this.txtPassword.Text; if (objCommon.CheckEmpty(this.txtUsername.Text) == 1) { Response.Write("Don't use blank Username !"); return; } if (objCommon.CheckEmpty(this.txtPassword.Text) == 1) { 28 Response.Write ("Don't use blank password !"); return; } if (this.txtPassword.Text != this.txtConf.Text) { Response.Write("Password anh confirm is suitable!"); return; } string _administrator; if (CheckBox1.Checked) _administrator = "1"; else _administrator = "0"; AccountDetails accdetail = new AccountDetails(_username, _password, _administrator); int _count = accdb.CheckAccount(_username); if (_count == 0) { Response.Write("Account is not readly!"); int _flag = accdb.InsertAccount(accdetail); if (_flag == 1) { Response.Write("Insert Account is success!"); } else { Response.Write("Insert Account is not success!"); } } else { Response.Write("Account is readly!"); } } } d.Xóa tài khoản: *Giao diện: 29 *Code: public partial class Interface_AccessWebsite_DeleteAcount : System.Web.UI.Page { private AccountDB objAccountDB = new AccountDB(); protected void Page_Load(object sender, EventArgs e) { DialogResult reply; reply = MessageBox.Show("Are you sure ?", "Yes or No Demo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (reply == DialogResult.Yes) { int intError = objAccountDB.DeleteAccount(Request.QueryString["username"]); if (intError == 1) { Response.Redirect("~/interface/accesswebsite/AccountList.aspx"); return; } Response.Write(objAccountDB.ErrorDetail); return; } else Response.Redirect("~/interface/accesswebsite/AccountList.aspx"); } e.Chỉnh sửa tài khoản: 30 public partial class Interface_AccessWebsite_EditAccount : System.Web.UI.Page { private AccountDB objAccountDB = new AccountDB(); private AccountDetails objAccountDetails = new AccountDetails(); private Common objCommon = new Common(); protected void Page_Load(object sender, EventArgs e) { objAccountDetails = objAccountDB.GetAccount(Request.QueryString["Username"]); this.txtUsername.Text = objAccountDetails.Username; if (IsPostBack) { if (objAccountDetails.Administrator == "1") { chkAdministrator.Checked = true; } else { chkAdministrator.Checked = false; } } } protected void CheckBox1_CheckedChanged(object sender, EventArgs e) { } protected void btOK_Click(object sender, EventArgs e) { string _username = this.txtUsername.Text; string _password = this.txtPassword.Text; if (objCommon.CheckEmpty(this.txtPassword.Text) == 1) { Response.Write("Dont use Blank Username !!"); } if (this.txtPassword.Text != this.txtConfirmPassword.Text) { Response.Write("Password anh confirm is suitable"); } string _administrator; if (chkAdministrator.Checked) { _administrator = "1"; } else { _administrator = "0"; } AccountDetails accdetail = new AccountDetails(_username, _password, _administrator); int _count = objAccountDB.UpdateAccount(accdetail); if (_count == 0) { 31 Response.Write("Username do not match !"); } else { int _flag = objAccountDB.UpdateAccount(accdetail); if (_flag == 1) { Response.Write("Update success"); return; } else { Response.Write("Update Account is not success!"); } } } protected void chkAdministrator_CheckedChanged(object sender, EventArgs e) { } } 32 2.Nhân viên: a.Xóa nhân viên: *Giao diện: *Code: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class Interface_Employees_DeleteEmp : System.Web.UI.Page { private EmployeeDB objEmployeeDB = new EmployeeDB(); protected void Page_Load(object sender, EventArgs e) { int intError = objEmployeeDB.DeleteEmployee(Request.QueryString["EmployeeID"]); if (intError == 1) { Response.Redirect("~/interface/employees/emplist.aspx"); return; } Response.Write(objEmployeeDB.ErrorDetail); } } 33 b.Cập nhật thông tin nhân viên: *Giao diện: public partial class Interface_Employees_EditEmployee : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { EmployeeDB objEmployeeDB = new EmployeeDB(); EmployeeDetails objEmployeeDetails = new EmployeeDetails(); SetRangOfList(lstDayOfDateOfBirth, 1, 31); SetRangOfList(lstDayOfEndDate, 1, 31); SetRangOfList(lstDayOfIssuedDate, 1, 31); SetRangOfList(lstDayOfProbEnd, 1, 31); SetRangOfList(lstDayOfStartDate, 1, 31); 34 SetRangOfList(lstMonthOfDateOfBirth, 1, 12); SetRangOfList(lstMonthOfEndDate, 1, 12); SetRangOfList(lstMonthOfIssuedDate, 1, 12); SetRangOfList(lstMonthOfStartDate, 1, 12); SetRangOfList(lstMonthOfProbEnd, 1, 12); SetRangOfList(lstYearOfDateOfBirth, 1970, 2007); SetRangOfList(lstYearOfEndDate, 2000, 2020); SetRangOfList(lstYearOfProbEnd, 2000, 2020); SetRangOfList(lstYearOfStartDate, 2000, 2020); SetRangOfList(lstYearOfIssuedDate, 2000, 2020); objEmployeeDetails = objEmployeeDB.GetEmployee(Request.QueryString["employeeID"]); if(!IsPostBack) { if (objEmployeeDB.Error == 0) { this.txtEmployeeID.Text = objEmployeeDetails.EmployeeID; this.txtFirstName.Text = objEmployeeDetails.FirstName; this.txtLastName.Text = objEmployeeDetails.LastName; this.lstDayOfDateOfBirth.Text = objEmployeeDetails.DateOfBirth.Day.ToString(); this.lstMonthOfDateOfBirth.Text = objEmployeeDetails.DateOfBirth.Month.ToString(); this.lstYearOfDateOfBirth.Text = objEmployeeDetails.DateOfBirth.Year.ToString(); this.txtPernamentAddress.Text = objEmployeeDetails.PernamentAddress; this.txtIDCardNumber.Text = objEmployeeDetails.IDCardNumber; this.lstDayOfIssuedDate.Text = objEmployeeDetails.IssuedDate.Day.ToString(); this.lstMonthOfIssuedDate.Text = objEmployeeDetails.IssuedDate.Month.ToString(); this.lstYearOfIssuedDate.Text = objEmployeeDetails.IssuedDate.Year.ToString(); this.txtIssuedPlace.Text = objEmployeeDetails.IssuedPlace; this.txtTitle.Text = objEmployeeDetails.Title; this.txtDepartment.Text = objEmployeeDetails.Department; this.lstDayOfStartDate.Text = objEmployeeDetails.StartDate.Day.ToString(); this.lstMonthOfStartDate.Text = objEmployeeDetails.StartDate.Month.ToString(); this.lstYearOfStartDate.Text = objEmployeeDetails.StartDate.Year.ToString(); this.lstDayOfProbEnd.Text = objEmployeeDetails.ProbEnd.Day.ToString(); this.lstMonthOfProbEnd.Text = objEmployeeDetails.ProbEnd.Month.ToString(); this.lstYearOfProbEnd.Text = objEmployeeDetails.ProbEnd.Year.ToString(); this.lstDayOfEndDate.Text = objEmployeeDetails.EndDate.Day.ToString(); 35 this.lstMonthOfEndDate.Text = objEmployeeDetails.EndDate.Month.ToString(); this.lstYearOfEndDate.Text = objEmployeeDetails.EndDate.Year.ToString(); this.txtContractStatus.Text = objEmployeeDetails.ContractStatus; this.txtGrossSalaryStatus.Text = objEmployeeDetails.GrossSalaryStatus.ToString(); }else { Response.Write(objEmployeeDB.ErrorDetail); } } } protected void bntUpdate_Click(object sender, EventArgs e) { Common objCommon = new Common(); EmployeeDetails objEmployeeDetail = new EmployeeDetails(); EmployeeDB objEmployeeDB = new EmployeeDB(); objEmployeeDetail.EmployeeID = this.txtEmployeeID.Text; objEmployeeDetail.FirstName = this.txtFirstName.Text; objEmployeeDetail.LastName = this.txtLastName.Text; objEmployeeDetail.DateOfBirth = objCommon.ConvertIntToDate( this.lstDayOfDateOfBirth.Text, this.lstMonthOfDateOfBirth.Text, this.lstYearOfDateOfBirth.Text); objEmployeeDetail.PernamentAddress = this.txtPernamentAddress.Text; objEmployeeDetail.IDCardNumber = this.txtIDCardNumber.Text; objEmployeeDetail.IssuedDate = objCommon.ConvertIntToDate( this.lstDayOfIssuedDate.Text, this.lstMonthOfIssuedDate.Text, this.lstYearOfIssuedDate.Text); objEmployeeDetail.IssuedPlace = this.txtIssuedPlace.Text; objEmployeeDetail.Title = this.txtTitle.Text; objEmployeeDetail.Department = this.txtDepartment.Text; objEmployeeDetail.StartDate = objCommon.ConvertIntToDate( this.lstDayOfStartDate.Text, this.lstMonthOfStartDate.Text, this.lstYearOfStartDate.Text); objEmployeeDetail.ProbEnd = objCommon.ConvertIntToDate( this.lstDayOfProbEnd.Text, this.lstMonthOfProbEnd.Text, this.lstYearOfProbEnd.Text); objEmployeeDetail.EndDate = objCommon.ConvertIntToDate( this.lstDayOfEndDate.Text, this.lstMonthOfEndDate.Text, this.lstYearOfEndDate.Text); 36 objEmployeeDetail.ContractStatus = this.txtContractStatus.Text; objEmployeeDetail.GrossSalaryStatus = objCommon.ConvertStrToNum(this.txtGrossSalaryStatus.Text); objEmployeeDB.UpdateEmployee(objEmployeeDetail); if (objEmployeeDB.Error == 1) { Response.Write(objEmployeeDB.ErrorDetail); } else { Response.Redirect("EmpList.aspx"); } } private void SetRangOfList(DropDownList parDropDownList, int parRangStart, int parRangEnd) { for (int i = parRangStart; i <= parRangEnd; i++) { parDropDownList.Items.Add(Convert.ToString(i)); } } protected void bntCancel_Click(object sender, EventArgs e) { Response.Redirect("EmpList.aspx"); } } c.Thêm mới nhân viên: public partial class Interface_Employeers_EmpAddNew : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { SetRangOfList(lstDayOfDateOfBirth, 1, 31); SetRangOfList(lstDayOfEndDate, 1, 31); SetRangOfList(lstDayOfIssuedDate, 1, 31); SetRangOfList(lstDayOfProbEnd, 1, 31); SetRangOfList(lstDayOfStartDate, 1, 31); SetRangOfList(lstMonthOfDateOfBirth, 1, 12); SetRangOfList(lstMonthOfEndDate, 1, 12); SetRangOfList(lstMonthOfIssuedDate, 1, 12); SetRangOfList(lstMonthOfStartDate, 1, 12); SetRangOfList(lstMonthOfProbEnd, 1, 12); SetRangOfList(lstYearOfDateOfBirth, 1970, 2007); SetRangOfList(lstYearOfEndDate, 2000, 2020); 37 SetRangOfList(lstYearOfProbEnd, 2000, 2020); SetRangOfList(lstYearOfStartDate, 2000, 2020); SetRangOfList(lstYearOfIssuedDate, 2000, 2020); } private void SetRangOfList(DropDownList parDropDownList, int parRangStart, int parRangEnd) { for (int i = parRangStart; i <= parRangEnd; i++) { parDropDownList.Items.Add(Convert.ToString(i)); } } protected void bntAddNew_Click(object sender, EventArgs e) { Common objCommon = new Common(); EmployeeDetails objEmployeeDetail = new EmployeeDetails(); EmployeeDB objEmployeeDB = new EmployeeDB(); objEmployeeDetail.EmployeeID = this.txtEmployeeID.Text; objEmployeeDetail.FirstName = this.txtFirstname.Text; objEmployeeDetail.LastName = this.txtLastname.Text; objEmployeeDetail.DateOfBirth = objCommon.ConvertIntToDate( this.lstDayOfDateOfBirth.Text, this.lstMonthOfDateOfBirth.Text, this.lstYearOfDateOfBirth.Text); objEmployeeDetail.PernamentAddress = this.txtPernamentAddress.Text; objEmployeeDetail.IDCardNumber = this.txtIDCardNumber.Text; objEmployeeDetail.IssuedDate = objCommon.ConvertIntToDate( this.lstDayOfIssuedDate.Text, this.lstMonthOfIssuedDate.Text, this.lstYearOfIssuedDate.Text); objEmployeeDetail.IssuedPlace = this.txtIssuedPlace.Text; objEmployeeDetail.Title = this.txtTitle.Text; objEmployeeDetail.Department = this.txtDepartment.Text; objEmployeeDetail.StartDate = objCommon.ConvertIntToDate( this.lstDayOfStartDate.Text, this.lstMonthOfStartDate.Text, this.lstYearOfStartDate.Text); objEmployeeDetail.ProbEnd = objCommon.ConvertIntToDate( this.lstDayOfProbEnd.Text, this.lstMonthOfProbEnd.Text, this.lstYearOfProbEnd.Text); objEmployeeDetail.EndDate = objCommon.ConvertIntToDate( this.lstDayOfEndDate.Text, this.lstMonthOfEndDate.Text, this.lstYearOfEndDate.Text); objEmployeeDetail.ContractStatus = this.txtContractStatus.Text; 38 objEmployeeDetail.GrossSalaryStatus = objCommon.ConvertStrToNum(this.txtGrossSalaryStatus.Text);// .ToInt32(this.txtContractStatus.Text); // objEmployeeDetail.PernamentAddress = this.txtPernamentAddress.Text; int intError = objEmployeeDB.InsertEmployee(objEmployeeDetail); if (intError == -1) { Response.Write(objEmployeeDB.ErrorDetail); return; } else { Response.Write("successly!"); Response.Redirect("EmpList.aspx"); } // Response.Redirect("EmpAddview.aspx"); } protected void bntCancel_Click(object sender, EventArgs e) { Response.Redirect("EmpList.aspx"); } } 39 *Giao diện: d.EmpAddView: e.Chi tiết thông tin nhân viên: f.Danh sách nhân viên: *Giao diện: 3.Thư mục: a.Xóa tài khoản_thư mục: public partial class Interface_AccessWebsite_DeleteAccMenu : System.Web.UI.Page 40 { private MenuDB objMenuDB = new MenuDB(); protected void Page_Load(object sender, EventArgs e) { int intError = objMenuDB.DeleteMenuAccount(Request.QueryString["Username"], Request.QueryString["IDMenu"]); if (intError == 1) { Response.Redirect("~/interface/accesswebsite/EditAccMenu.aspx"); return; } Response.Write("Error"); return; } } b.Sửa chữa Thư mục: public partial class Interface_AccessWebsite_DeleteAccMenu : System.Web.UI.Page { private MenuDB objMenuDB = new MenuDB(); protected void Page_Load(object sender, EventArgs e) { int intError = objMenuDB.DeleteMenuAccount(Request.QueryString["Username"], Request.QueryString["IDMenu"]); if (intError == 1) { Response.Redirect("~/interface/accesswebsite/EditAccMenu.aspx"); return; } Response.Write("Error"); return; } } II.Model(Mô hình) Gồm AccountDetails (Chi tiết tài khoản), MenuDetails (Chi tiết danh bạ) và EmployeeDetails (Chi tiết nhân viên): *Code: using System; using System.Data; using System.Configuration; using System.Web; 41 using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; /// /// Summary description for AccountDetails /// public class AccountDetails { /** * Function : AccountDetails * Author : longch * Date : 2007 - 12 - 22 * Input : * Output : * Description : **/ public AccountDetails() { // // TODO: Add constructor logic here // } /** * Function : AccountDetails * Author : longch * Date : 2007 - 12 - 22 * Input : string, string * Output : * Description : **/ public AccountDetails(string username, string password) { // // TODO: Add constructor logic here // this.username = username; this.password = password; } public AccountDetails(string parUsername, string parPassword,string parAdministrator) { // // TODO: Add constructor logic here // this.username = parUsername; this.password = parPassword; this.administrator = parAdministrator; } 42 private string username; public string Username { get { return username; } set { username = value; } } private string password; public string Password { get { return password; } set { password = value;} } private string administrator; public string Administrator { get { return administrator; } set { administrator = value; } } } MenuDetails using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; /// /// Summary description for MenuDetails /// public class MenuDetails { public MenuDetails(string parIDmenu,string parNameMenu) { this.idMenu = parIDmenu; this.nameMenu = parNameMenu; } public MenuDetails() { // // TODO: Add constructor logic here // } private string idMenu; public string IdMenu { get { return idMenu; } set { idMenu = value; } 43 } private string username; public string Username { get { return username; } set { username = value; } } private string nameMenu; public string NameMenu { get { return nameMenu;} set { nameMenu = value;} } private string link; public string Link { get { return link; } set { link = value; } } private string idParent; public string IdParent { get { return idParent; } set { idParent = value; } } } EmployeeDetails using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; /// /// Summary description for EmployeeDetails /// /// public class EmployeeDetails { public EmployeeDetails() { // // TODO: Add constructor logic here // } 44 private string employeeID; public string EmployeeID { get { return employeeID; } set { employeeID = value; } } private string firstName; public string FirstName { get { return firstName; } set { firstName = value; } } private string lastName; public string LastName { get { return lastName; } set { lastName = value; } } private DateTime dateOfBirth;// //datetime Checked private string pernamentAddress ; private string iDCardNumber; private DateTime issuedDate;// datetime Checked private string issuedPlace;// nchar(30) Checked private string title; // nchar(30) Checked private string department; // nchar(30) Checked private DateTime startDate;// datetime Checked private DateTime probEnd; //datetime Checked private DateTime endDate; //datetime Checked private string contractStatus;// nchar(50) Checked private int grossSalaryStatus;// numeric(18, 0) Checked public DateTime DateOfBirth { get { return dateOfBirth; } set { dateOfBirth = value; } } public string PernamentAddress { get { return pernamentAddress; } set { pernamentAddress = value; } } public string IDCardNumber { get { return iDCardNumber; } set { iDCardNumber = value; } } public DateTime IssuedDate { get { return issuedDate; } set { issuedDate = value; } 45 }// datetime Checked public string IssuedPlace { get { return issuedPlace; } set { issuedPlace = value; } }// nchar(30) Checked public string Title { get { return title; } set { title = value; } }// nchar(30) Checked public string Department { get { return department; } set { department = value; } }// nchar(30) Checked public DateTime StartDate { get { return startDate; } set { startDate = value; } }// datetime Checked public DateTime ProbEnd { get { return probEnd; } set { probEnd = value; } }//datetime Checked public DateTime EndDate { get { return endDate; } set { endDate = value; } } //datetime Checked public string ContractStatus { get { return contractStatus; } set { contractStatus = value; } }// nchar(50) Checked public int GrossSalaryStatus { get { return grossSalaryStatus; } set { grossSalaryStatus = value; } }// numeric(18, 0) Checked // private string pernamentAddress; // public string PernamentAddress //{ // set { PernamentAddress = value; } // } public EmployeeDetails(string employeeID, string firstName, string lastName) { this.employeeID = employeeID; this.firstName = firstName; this.lastName = lastName; 46 //this.pernamentAddress = pernamentAddress; } } III.Controller(Điều khiển): Gồm AccountDB (Tài khoản), MenuDB (Thư mục), EmployeeDB (Nhân viên). *Code phần AccountDB (Tài khoản): using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; /** * Task: add lib * Author: longch - cao hoang long **/ using System.Data.SqlClient; using System.Collections; /// /// Summary description for AccountDB /// public class AccountDB { private Common objCommon = new Common(); /** * Function : AccountDB * Author : longch * Date : 2007 - 12 - 22 * Input : * Output : * Description : **/ public AccountDB() { // // TODO: Add constructor logic here // connectionString = ConfigurationSettings.AppSettings["databaseConnectionString"]; } /** * Function : AccountDB * Author : longch * Date : 2007 - 12 - 22 * Input : * Output : * Description : 47 **/ private string connectionString; public string ConnectionString { get { return connectionString; } set { connectionString = value; } } /** * Function : AccountDB * Author : longch * Date : 2007 - 12 - 22 * Input : * Output : * Description : **/ private int error; /** * Function : AccountDB * Author : longch * Date : 2007 - 12 - 22 * Input : * Output : * Description : **/ public int Error { get { return error; } set { error = value; } } private string errorDetail; public string ErrorDetail { get { return errorDetail; } set { errorDetail = value; } } public int CheckAccount(AccountDetails acc) { SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("CountAccount", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 10)); cmd.Parameters["@Username"].Value = acc.Username; cmd.Parameters.Add(new SqlParameter("@Password", SqlDbType.NVarChar, 10)); cmd.Parameters["@Password"].Value = acc.Password; Error = 0; try { con.Open(); return (int)cmd.ExecuteScalar(); } catch (SqlException objError) { // Replace the error with something less specific. // You could also log the error now. 48 // throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return -1; } finally { con.Close(); } } public int CheckAdminAccount(AccountDetails parAccountDetails) { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objCommand = new SqlCommand("CheckAdminAccount", objConnection); objCommand.CommandType = CommandType.StoredProcedure; objCommand.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 10)); objCommand.Parameters["@Username"].Value = parAccountDetails.Username; objCommand.Parameters.Add(new SqlParameter("@Password", SqlDbType.NVarChar, 10)); objCommand.Parameters["@Password"].Value = parAccountDetails.Password; Error = 0; try { objConnection.Open(); return (int)objCommand.ExecuteScalar(); } catch (SqlException objError) { // Replace the error with something less specific. // You could also log the error now. // throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return -1; } finally { objConnection.Close(); } } public int CheckAccount(string _username) { SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("CountAccount2", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 10)); cmd.Parameters["@Username"].Value = _username; Error = 0; try 49 { con.Open(); return (int)cmd.ExecuteScalar(); } catch (SqlException objError) { // Replace the error with something less specific. // You could also log the error now. // throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return 0; } finally { con.Close(); } } public int InsertAccount(AccountDetails parAccountDetails) { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objcommand = new SqlCommand("InsertAccount", objConnection); objcommand.CommandType = CommandType.StoredProcedure; objcommand.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 10)); objcommand.Parameters["@UserName"].Value = parAccountDetails.Username; objcommand.Parameters.Add(new SqlParameter("@Password", SqlDbType.NVarChar, 10)); objcommand.Parameters["@Password"].Value = parAccountDetails.Password; objcommand.Parameters.Add(new SqlParameter("@Administrator", SqlDbType.NVarChar, 10)); objcommand.Parameters["@Administrator"].Value = Convert.ToInt32(parAccountDetails.Administrator); Error = 0; try { objConnection.Open(); objcommand.ExecuteNonQuery(); return 1; } catch (SqlException objError) { // Replace the error with something less specific. // You could also log the error now. // throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return 0; } finally { objConnection.Close(); 50 } } /** * Function : AccountDB * Author : longch * Update : DucPN * Date : 2007 - 12 - 22 * Input : (AccountDetails acc)(int) * Output :int * Description : return =0 dont change return =1 change pass **/ public int ChangePassword(AccountDetails parAccountDetails) { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objCommand = new SqlCommand("ChangePassword", objConnection); objCommand.CommandType = CommandType.StoredProcedure; objCommand.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 10)); objCommand.Parameters["@Username"].Value = parAccountDetails.Username; objCommand.Parameters.Add(new SqlParameter("@Password", SqlDbType.NVarChar, 10)); objCommand.Parameters["@Password"].Value = parAccountDetails.Password; Error = 0; //check blank pass if (objCommon.CheckEmpty(parAccountDetails.Password) != 1) try { objConnection.Open(); objCommand.ExecuteNonQuery(); return 1; } catch (SqlException objError) { // Replace the error with something less specific. // You could also log the error now. // throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return 0; } finally { objConnection.Close(); } else return 0; } 51 public AccountDetails[] GetAllAccounts() { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objCommand = new SqlCommand("GetAllAccounts", objConnection); objCommand.CommandType = CommandType.StoredProcedure; // Create a collection for all the employee records. ArrayList arrAccounts = new ArrayList(); Error = 0; try { objConnection.Open(); SqlDataReader objReader = objCommand.ExecuteReader(); while (objReader.Read()) { AccountDetails objAccountDetails = new AccountDetails(); //(int)reader["EmployeeID"], (string)reader["FirstName"], //(string)reader["LastName"], (string)reader["TitleOfCourtesy"]); objAccountDetails.Username = objReader["Username"].ToString(); objAccountDetails.Password = objReader["Password"].ToString(); objAccountDetails.Administrator = objReader["Administrator"].ToString() ; arrAccounts.Add(objAccountDetails); } objReader.Close(); return ((AccountDetails[])arrAccounts.ToArray(typeof(AccountDetails))); } catch (SqlException objError) { //throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return null; } finally { objConnection.Close(); } } public AccountDetails[] GetAllUser() { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objCommand = new SqlCommand("GetUser", objConnection); objCommand.CommandType = CommandType.StoredProcedure; // Create a collection for all the employee records. ArrayList arrAccounts = new ArrayList(); Error = 0; 52 try { objConnection.Open(); SqlDataReader objReader = objCommand.ExecuteReader(); while (objReader.Read()) { AccountDetails objAccountDetails = new AccountDetails(); //(int)reader["EmployeeID"], (string)reader["FirstName"], //(string)reader["LastName"], (string)reader["TitleOfCourtesy"]); objAccountDetails.Username = objReader["Username"].ToString(); objAccountDetails.Password = objReader["Password"].ToString(); objAccountDetails.Administrator = objReader["Administrator"].ToString(); arrAccounts.Add(objAccountDetails); } objReader.Close(); return ((AccountDetails[])arrAccounts.ToArray(typeof(AccountDetails))); } catch (SqlException objError) { //throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return null; } finally { objConnection.Close(); } } public AccountDetails[] GetAccounts(string parUsername) { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objCommand = new SqlCommand("GetAccounts", objConnection); objCommand.CommandType = CommandType.StoredProcedure; objCommand.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar, 10)); objCommand.Parameters["@Username"].Value = parUsername; // Create a collection for all the employee records. ArrayList arrAccounts = new ArrayList(); Error = 0; try { objConnection.Open(); SqlDataReader objReader = objCommand.ExecuteReader(); while (objReader.Read()) 53 { AccountDetails objAccountDetails = new AccountDetails(); //(int)reader["EmployeeID"], (string)reader["FirstName"], //(string)reader["LastName"], (string)reader["TitleOfCourtesy"]); objAccountDetails.Username = objReader["Username"].ToString(); objAccountDetails.Password = objReader["Password"].ToString(); objAccountDetails.Administrator = objReader["Administrator"].ToString(); arrAccounts.Add(objAccountDetails); } objReader.Close(); return ((AccountDetails[])arrAccounts.ToArray(typeof(AccountDetails))); } catch (SqlException objError) { //throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return null; } finally { objConnection.Close(); } } public AccountDetails GetAccount(string parUsername) { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objCommand = new SqlCommand("GetAccounts", objConnection); AccountDetails objAccountDetails = new AccountDetails(); ArrayList arrAccounts = new ArrayList(); objCommand.CommandType = CommandType.StoredProcedure; objCommand.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar, 10)); objCommand.Parameters["@Username"].Value = parUsername; // Create a collection for all the employee records. Error = 0; try { objConnection.Open(); SqlDataReader objReader = objCommand.ExecuteReader(); while (objReader.Read()) { 54 //(int)reader["EmployeeID"], (string)reader["FirstName"], //(string)reader["LastName"], (string)reader["TitleOfCourtesy"]); objAccountDetails.Username = objReader["Username"].ToString(); objAccountDetails.Password = objReader["Password"].ToString(); objAccountDetails.Administrator = objReader["Administrator"].ToString(); arrAccounts.Add(objAccountDetails); } objReader.Close(); } catch (SqlException objError) { //throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return null; } finally { objConnection.Close(); } return objAccountDetails; } public int DeleteAccount(string parUsername) { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objCommand = new SqlCommand("DeleteAccount", objConnection); SqlCommand objDeleteMenu = new SqlCommand("DeleteMenu_acc",objConnection); objCommand.CommandType = CommandType.StoredProcedure; objCommand.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar, 10)); objCommand.Parameters["@Username"].Value = parUsername; objDeleteMenu.CommandType = CommandType.StoredProcedure; objDeleteMenu.Parameters.Add(new SqlParameter("@_Username", SqlDbType.NVarChar, 20)); objDeleteMenu.Parameters["@_Username"].Value = parUsername; Error = 0; try { objConnection.Open(); objCommand.ExecuteNonQuery(); objDeleteMenu.ExecuteNonQuery(); } catch (SqlException objError) { // Replace the error with something less specific. // You could also log the error now. // throw new ApplicationException("Data error."); Error = 1; 55 ErrorDetail = objError.ToString(); return 0; } finally { objConnection.Close(); } return 1; } public int UpdateAccount(AccountDetails parAccountDetails) { SqlConnection objConnection = new SqlConnection(connectionString); SqlCommand objCommand = new SqlCommand("UpdateAccount", objConnection); objCommand.CommandType = CommandType.StoredProcedure; objCommand.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar, 10)); objCommand.Parameters.Add(new SqlParameter("@Password", SqlDbType.NVarChar, 10)); objCommand.Parameters.Add(new SqlParameter("@Administrator", SqlDbType.Int, 8)); objCommand.Parameters["@Username"].Value = parAccountDetails.Username; objCommand.Parameters["@Password"].Value = parAccountDetails.Password; int intValue; if (objCommon.CheckString(parAccountDetails.Administrator) == 0) { intValue = Int32.Parse(parAccountDetails.Administrator); } else { intValue = 0; } objCommand.Parameters["@Administrator"].Value = intValue; Error = 0; try { objConnection.Open(); objCommand.ExecuteNonQuery(); } catch (SqlException objError) { // Replace the error with something less specific. // You could also log the error now. // throw new ApplicationException("Data error."); Error = 1; ErrorDetail = objError.ToString(); return 0; } finally { objConnection.Close(); 56 } return 1; } } 57 MỤC LỤC Lời mở đầu .................................................................... 1 Chương I.GIỚI THIỆU VỀ CÔNG TY THỰC TẬP VÀ MỤC ĐÍCH XÂY DỰNG PHẦN MỀM. ............ 3 I. Giới thiệu công ty ................................................................................................... 3 1.Giới thiệu công ty: .............................................................................................. 3 2. Đội ngũ quản lý: ................................................................................................. 5 3.Lĩnh vực hoạt động chính: .................................................................................. 6 II.Mục đích xây dựng chương trình: ........................................................................ 6 1.Mục đích xây dựng chương trình:...................................................................... 6 2.Tổng quan về chương trình: ............................................................................... 7 Chương II. TỔNG QUAN VỀ MÔ HÌNH MODEL- VIEW-CONTROLLER (MVC). ................................ 9 I.Giới thiệu mô hình MVC: ....................................................................................... 9 1.Thiết kế MVC: .................................................................................................... 9 CHƯƠNG III.PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG ...................................................................... 12 I. Giới thiệu : ............................................................................................................ 12 II. Phân tích hệ thống theo Chức năng ................................................................... 12 1.Quản lý người dùng .......................................................................................... 12 2.Quản lý thư mục ............................................................................................... 13 3.Quản lý Phân quyền ......................................................................................... 13 4.Quản lý Nhân viên ............................................................................................ 13 III. Phân tích hệ thống theo sơ đồ luồng dữ liệu .................................................... 13 1.Sơ đồ luồng dữ liệu mức ngữ cảnh ................................................................... 13 2.Sơ đồ luồng dữ liệu mức đỉnh : ........................................................................ 14 3.Sơ đồ luồng dữ liệu mức dưới đỉnh: ................................................................. 15 4.Sơ đồ luồng dữ liệu tổng quát: .......................................................................... 17 VI.Các bảng cơ sở dữ liệu dùng trong chương trình: ............................................ 18 CHƯƠNG IV.CẤU TRÚC CHƯƠNG TRÌNH ĐƯỢC ÁP DỤNG MÔ HÌNH MVC ........................ 21 I.View(Interface_Hiển thị): ...................................................................................... 21 1.Truy cập vào web: ............................................................................................ 21 2.Nhân viên: ......................................................................................................... 32 3.Thư mục: ........................................................................................................... 39 III.Controller(Điều khiển): ...................................................................................... 46

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

  • pdfLuận văn- Áp dụng mô hình MVC của Công ty cổ phần công nghệ thanh toán Việt Nam (Vinapay).pdf
Luận văn liên quan