Professional Documents
Culture Documents
Báo Cáo Môn Học: Lập Trình Hướng Đối Tượng
Báo Cáo Môn Học: Lập Trình Hướng Đối Tượng
Báo Cáo Môn Học: Lập Trình Hướng Đối Tượng
MÃ HP: OOPR230279_07CLC
ĐIỂM
NHẬN XÉT
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
Ký tên
Chúng em xin gửi lời cảm ơn chân thành đến thầy và toàn thể Hội đồng giảng
dạy đã truyền đạt kiến thức quý báu về môn học "Lập trình hướng đối tượng".
Những buổi học đã mang đến cho chúng em một sự hiểu biết sâu sắc về cách
tiếp cận và xây dựng các chương trình theo phương pháp này.
Chúng em xin bày tỏ lòng biết ơn đặc biệt đến thầy đã dành thời gian và công
sức để giảng dạy và hỗ trợ chúng em trong quá trình nắm bắt và ứng dụng lập
trình hướng đối tượng. Nhờ sự chỉ dẫn tận tâm của thầy/cô, chúng em đã có cơ
hội áp dụng các khái niệm, nguyên tắc và kỹ thuật lập trình hướng đối tượng
vào thực tế.
Dù trong quá trình học tập, chúng em có thể gặp khó khăn và mắc phải những
sai sót, nhưng chúng em rất biết ơn vì đã có sự kiên nhẫn và nhẹ nhàng của
thầy trong việc giải đáp và chỉ dẫn. Những phản hồi và góp ý từ thầy đã giúp
chúng em hoàn thiện kỹ năng lập trình hướng đối tượng.
Cuối cùng, chúng em xin gửi lời cảm ơn sâu sắc đến Ban giám hiệu và trường
Đại học đã tạo điều kiện và cung cấp một môi trường học tập tốt, giúp chúng
em phát triển khả năng lập trình và chuẩn bị tốt cho tương lai nghề nghiệp.
Kính chúc thầy và toàn thể Hội đồng giảng dạy sức khỏe, hạnh phúc và thành
công trong công việc giảng dạy. Lời cảm ơn chân thành này sẽ luôn ở trong
lòng chúng em và mang ý nghĩa đặc biệt trong cuộc sống và sự nghiệp của
chúng em.
a. Lớp Food................................................................................................3
b. Lớp Account...........................................................................................3
c. Lớp Bill..................................................................................................4
d. Lớp BillInfo............................................................................................4
e. Lớp Category..........................................................................................5
f. Lớp Staff.................................................................................................5
g. Lớp Table...............................................................................................7
a. Lớp ControlAccount:..............................................................................7
b. Lớp Controlbill:......................................................................................8
c. Lớp ControlBillInfo:............................................................................10
d. Lớp ControlCategory:..........................................................................11
e. Lớp Controlfood:..................................................................................13
f. Lớp ControlStaff:..................................................................................15
g. Lớp ControlTable:................................................................................18
Mục tiêu của ứng dụng là xây dựng một hệ thống quản lý nhà hàng hiệu
quả, tuân thủ nguyên tắc của Lập trình Hướng đối tượng (OOP), với mong
muốn tối ưu hóa năng suất và cung cấp công cụ hỗ trợ tối ưu hoá hoạt động
kinh doanh. Ứng dụng được thiết kế để đáp ứng nhu cầu tổ chức công việc,
tăng cường hiệu suất làm việc và đảm bảo sự hài lòng của khách hàng.
Chúng tôi sử dụng các khái niệm OOP, như lớp, đối tượng, kế thừa, và
đa hình để biểu diễn thông tin liên quan đến tài khoản nhân viên, bàn ăn, món
ăn, doanh thu, và các dữ liệu thống kê. Điều này giúp tạo ra một cấu trúc dữ
liệu có tổ chức, dễ quản lý và mở rộng.
Hệ thống cung cấp khả năng theo dõi doanh thu, quản lý đơn hàng, và
tổng hợp thông tin kinh doanh, mang lại cái nhìn tổng quan cho nhà quản lý.
Việc này giúp họ đưa ra quyết định thông minh và tối ưu hóa chiến lược kinh
doanh của mình.
Tổng thể, ứng dụng được xây dựng với triết lý OOP nhằm tăng cường
tính linh hoạt, tái sử dụng mã nguồn, và dễ bảo trì, tạo nên một công cụ quản
lý nhà hàng đa chiều, từ nhân viên đến quản lý, nhằm đáp ứng đa dạng và đòi
hỏi cao trong môi trường kinh doanh thực tế.
Phạm vi và đối tượng mà ứng dụng nhắm đến là nhà hàng và chủ yếu là
các nhân viên trong nội bộ nhà hàng.
1
- Đăng nhập bằng tài khoản.
- Thay đổi thông tin đăng nhập của tài khoản như mật khẩu,..
- Hiển thị tình trạng của các bàn ăn (trống hoặc đang có người), tổng tiền
của bàn ăn và thao tác thêm món ăn, số lượng món ăn, giảm giá và thanh
toán.
- Hiển thị doanh thu tổng và tra cứu doanh thu theo ngày.
- Hiển thị danh sách món ăn và các thao tác thêm, xóa, sửa, tìm kiếm dựa
theo tên món ăn.
- Hiển thị danh sách danh mục món ăn và các thao tác thêm, xóa, sửa.
- Hiển thị danh sách bàn ăn và các thao tác thêm, xóa, sửa.
- Điểm danh.
- Hiển thị danh sách nhân sự và các thao tác thêm, xóa, sửa, tìm kiếm dựa
theo tên nhân sự.
2
Phần 2: Thiết kế chương trình
Thuộc tính:
3
Food(int id, string name, string category, int price, int stock):
Constructor để khởi tạo một đối tượng Food với các giá trị cụ thể cho
ID, tên, danh mục, giá và tồn kho.
b. Lớp Account
Thuộc Tính:
Phương Thức:
1. Account (): Hàm khởi tạo mặc định không tham số.
2. Account(string accountid, string username, string displayname,
string password, string role) (Constructor có tham số): Khởi tạo
một đối tượng Account với các thông tin được cung cấp.
c. Lớp Bill
Thuộc Tính:
Phương Thức:
4
2. Bill(int id, DateTime dateCheckin, int idtable, int status, decimal
cost) (Constructor có tham số): Khởi tạo một đối tượng Bill với
các thông tin được cung cấp.
d. Lớp BillInfo
Thuộc Tính:
1. ID (Kiểu: int): Định danh duy nhất của thông tin chi tiết hóa đơn.
2. IDBill (Kiểu: int): Định danh của hóa đơn liên kết với thông tin
chi tiết.
3. IDfood (Kiểu: int): Định danh của món ăn liên kết với thông tin
chi tiết.
4. Quantity (Kiểu: int): Số lượng của món ăn trong hóa đơn.
Phương Thức:
Thuộc Tính:
1. ID (Kiểu: int): Định danh duy nhất của loại danh mục.
2. Name (Kiểu: string): Tên của danh mục.
Phương Thức:
Interface Bonus:
5
Thuộc tính: bonus (kiểu double)
Phương thức:
Check(): Kiểm tra xem nhân viên đã điểm danh trong ngày hiện
tại hay chưa.
SaveAttendance(): Lưu thông tin điểm danh vào tập tin.
DiemDanh(): Điểm danh nhân viên và cập nhật thông tin.
6
LuongCuoi(): Tính toán và trả về lương cuối cùng của
Administrator.
Thuộc Tính:
Phương Thức:
7
2.2.2. Các class xử lí
a. Lớp ControlAccount:
Thuộc Tính:
1. loggedInUsername: Một chuỗi static để lưu trữ tên người dùng
đăng nhập.
2. acccouts: Một danh sách các đối tượng Account, đại diện cho các
tài khoản trong hệ thống.
3. Acccouts: Thuộc tính public để truy cập danh sách các tài khoản.
Phương Thức:
1. add(Account acccout): Thêm một tài khoản vào danh sách.
2. remove(Account acccout): Xóa một tài khoản khỏi danh sách.
3. Login(string username): Đăng nhập bằng tên người dùng.
4. GetLoggedInUsername(): Phương thức static để truy cập tên
người dùng đã đăng nhập.
5. find(string dieukien): Tìm kiếm các tài khoản theo điều kiện cho
trước.
6. readcate(): Đọc danh sách tài khoản từ file XML.
7. Authenticate(string username, string password): Xác thực tài
khoản người dùng.
8. UpdateAccount(string username, string displayname, string
password, string newpass, string reenterPass): Cập nhật thông tin
tài khoản.
9. AddAccount(int id, string username, string password, string role):
Thêm một tài khoản mới.
10.RemoveAccount(int id): Xóa một tài khoản.
11.AddAccountToXml(Account newAccount): Thêm một tài khoản
vào file XML.
12.SaveAccountsToXml(): Lưu danh sách tài khoản vào file XML.
8
13.RemoveAccountInXml(int id): Xóa một tài khoản khỏi file XML.
b. Lớp Controlbill:
Thuộc Tính:
Phương Thức:
Ghi Chú:
9
- Lớp Controlbill có nhiệm vụ quản lý hóa đơn trong hệ thống, thực
hiện các thao tác như thêm, xóa, đọc, và thanh toán hóa đơn.
- Phương thức GetUncheckBillbyTableid được sử dụng để kiểm tra
xem một bàn có đang sử dụng hay không.
- Phương thức insertbill được sử dụng để tạo một hóa đơn mới và
thêm vào danh sách.
- Phương thức Checkout được sử dụng để thanh toán một hóa đơn, cập
nhật trạng thái và chi phí.
- Phương thức SaveToXML được sử dụng để lưu danh sách hóa đơn
vào file XML.
- Danh sách hóa đơn được lưu và quản lý trong biến billList.
c. Lớp ControlBillInfo:
Thuộc Tính:
billin4 (Kiểu: List<BillInfo>): Danh sách các thông tin chi tiết
hóa đơn trong hệ thống.
Phương Thức:
1. add(BillInfo bill): Thêm một thông tin chi tiết hóa đơn vào danh
sách.
2. remove(BillInfo bill): Xóa một thông tin chi tiết hóa đơn khỏi
danh sách.
3. update(BillInfo bill): Phương thức dự kiến cho việc cập nhật
thông tin của thông tin chi tiết hóa đơn, nhưng chưa được triển
khai.
4. find(int dieukien): List<BillInfo>: Tìm kiếm các thông tin chi tiết
hóa đơn theo điều kiện.
10
5. readbill(): Đọc danh sách thông tin chi tiết hóa đơn từ file XML
và thêm vào danh sách billin4.
6. MergeDuplicateBillInfo(): Hợp nhất các thông tin chi tiết hóa đơn
trùng lặp (cùng IDBill và IDfood) để giảm số lượng dữ liệu trùng.
7. insertbillinfo(int idBill, int idFood, int quantity): Thêm một thông
tin chi tiết hóa đơn mới vào danh sách.
8. GetNextBillInfoID(): int: Lấy ID cho thông tin chi tiết hóa đơn
mới, dựa trên số lượng thông tin chi tiết hiện tại.
9. SaveBillInfoToXML(): Lưu danh sách thông tin chi tiết hóa đơn
vào file XML.
Ghi Chú:
- Lớp ControlBillinfo có nhiệm vụ quản lý thông tin chi tiết hóa đơn
trong hệ thống, thực hiện các thao tác như thêm, xóa, đọc, và hợp
nhất thông tin chi tiết hóa đơn.
- Phương thức MergeDuplicateBillInfo được sử dụng để hợp nhất các
thông tin chi tiết hóa đơn trùng lặp.
- Phương thức insertbillinfo được sử dụng để thêm một thông tin chi
tiết hóa đơn mới và lưu vào danh sách.
- Phương thức GetNextBillInfoID được sử dụng để lấy ID cho thông
tin chi tiết hóa đơn mới.
- Phương thức SaveBillInfoToXML được sử dụng để lưu danh sách
thông tin chi tiết hóa đơn vào file XML.
- Danh sách thông tin chi tiết hóa đơn được lưu và quản lý trong biến
billin4.
d. Lớp ControlCategory:
Thuộc Tính:
11
categories (Kiểu: List<Category>): Danh sách các danh mục
(Category) trong hệ thống.
Phương Thức:
1. add(Category category): Thêm một danh mục mới vào danh sách.
2. remove(Category category): Xóa một danh mục khỏi danh sách.
3. update(Category category): Cập nhật thông tin của một danh mục
trong danh sách và lưu thay đổi vào tệp XML.
4. savechange(Category category): Ghi thông tin của một danh mục
vào tệp Category.xml.
5. UpdateCategory(int id, string name): bool: Cập nhật thông tin của
một danh mục dựa trên ID và kiểm tra xem cập nhật thành công
hay không.
6. DeleteCategory(int id): bool: Xóa một danh mục khỏi danh sách
và lưu thay đổi vào tệp XML.
7. WriteCategory(): Ghi danh sách danh mục vào tệp Category.xml.
8. CheckCategoryID(int categoryid): bool: Kiểm tra xem một ID
danh mục đã tồn tại chưa.
9. CheckCategoryName(string categoryname): bool: Kiểm tra xem
một tên danh mục đã tồn tại chưa.
10.find(string dieukien): List<Category>: Tìm kiếm các danh mục
theo điều kiện.
11.readcate(): Đọc danh sách danh mục từ file XML và thêm vào
danh sách categories.
Ghi Chú:
- Lớp ControlCategory quản lý các thao tác liên quan đến danh mục trong
hệ thống.
12
- Phương thức update cập nhật thông tin của một danh mục và lưu thay
đổi vào tệp XML Category.xml.
- Phương thức savechange ghi thông tin của một danh mục vào tệp XML
Category.xml.
- Phương thức UpdateCategory cập nhật thông tin của một danh mục dựa
trên ID và kiểm tra xem cập nhật thành công hay không.
- Phương thức DeleteCategory xóa một danh mục khỏi danh sách và lưu
thay đổi vào tệp XML Category.xml.
- Phương thức WriteCategory ghi danh sách danh mục vào tệp XML
Category.xml.
- Các phương thức CheckCategoryID và CheckCategoryName kiểm tra
xem một ID hoặc tên danh mục đã tồn tại chưa.
- Danh sách danh mục được quản lý trong biến categories.
e. Lớp Controlfood:
Thuộc Tính:
Phương Thức:
13
6. DeleteFood(int foodID): bool: Xóa một món ăn khỏi danh sách và
lưu thay đổi vào tệp XML.
7. GetFoodsByCategoryID(string categoryID): List<Food>: Lấy
danh sách món ăn theo ID danh mục.
8. WriteFood(): Ghi danh sách món ăn vào tệp XML Food.xml.
9. UpdateFood(int foodId, string name, string category, int price, int
stock): bool: Cập nhật thông tin của một món ăn và kiểm tra xem
cập nhật thành công hay không.
10.CheckFoodStock(int foodID, int quantity): bool: Kiểm tra xem có
đủ số lượng thức ăn hay không.
11.DecreaseFoodStock(int foodID, int quantity): bool: Giảm số
lượng thức ăn và lưu thay đổi vào tệp XML.
12.GetFoodById(int foodID): Food: Lấy thông tin thức ăn dựa trên
ID.
13.CheckFoodID(int foodID): bool: Kiểm tra xem một ID thức ăn đã
tồn tại chưa.
14.CheckFoodName(string foodname): bool: Kiểm tra xem một tên
thức ăn đã tồn tại chưa.
15.SearchFoodByName(string keyword): List<Food>: Tìm kiếm
món ăn theo tên gần đúng.
Ghi Chú:
- Lớp ControlFood quản lý các thao tác liên quan đến món ăn trong hệ
thống.
- Phương thức savechange ghi thông tin của một món ăn vào tệp XML
Food.xml.
- Phương thức DeleteFood xóa một món ăn khỏi danh sách và lưu thay
đổi vào tệp XML Food.xml.
14
- Phương thức GetFoodsByCategoryID lấy danh sách món ăn dựa trên ID
danh mục.
- Phương thức WriteFood ghi danh sách món ăn vào tệp XML Food.xml.
- Phương thức UpdateFood cập nhật thông tin của một món ăn và kiểm
tra xem cập nhật thành công hay không.
- Phương thức CheckFoodStock kiểm tra xem có đủ số lượng thức ăn hay
không.
- Phương thức DecreaseFoodStock giảm số lượng thức ăn và lưu thay đổi
vào tệp XML.
- Phương thức GetFoodById lấy thông tin thức ăn dựa trên ID.
- Các phương thức CheckFoodID và CheckFoodName kiểm tra xem một
ID hoặc tên thức ăn đã tồn tại chưa.
- Phương thức SearchFoodByName tìm kiếm món ăn theo tên gần đúng.
f. Lớp ControlStaff:
Thuộc tính:
1. Bonus:
Kiểu: double
Mô tả: Đại diện cho tiền thưởng cho nhân viên.
2. Staffs:
Kiểu: List<Staff>
Mô tả: Đại diện cho một danh sách các nhân viên.
3. Administrators:
Kiểu: List<Administrator>
Mô tả: Đại diện cho một danh sách các quản trị viên.
4. Chefs:
Kiểu: List<Chef>
Mô tả: Đại diện cho một danh sách các đầu bếp.
5. Cashiers:
15
Kiểu: List<Cashier>
Mô tả: Đại diện cho một danh sách các thu ngân.
6. Servers:
Kiểu: List<Server>
Mô tả: Đại diện cho một danh sách các phục vụ.
Phương thức:
thuongchef:
Tham số: Không
Mô tả: Tính toán và gán tiền thưởng cho đầu bếp dựa trên một
điều kiện.
thuongadmin:
Tham số: Không
Mô tả: Tính toán và gán tiền thưởng cho quản trị viên dựa trên
một điều kiện.
tinhbonus:
Tham số: Không
Kiểu trả về: double
Mô tả: Tính toán tiền thưởng dựa trên chi phí các hóa đơn trong
tháng hiện tại.
add:
Tham số: Staff, Administrator, Chef, Cashier, Server
Mô tả: Thêm một thành viên nhân viên, quản trị viên, đầu bếp,
thu ngân hoặc phục vụ vào danh sách tương ứng của họ.
remove:
Tham số: Staff
Mô tả: Loại bỏ một nhân viên khỏi danh sách.
update:
Tham số: Staff
16
Mô tả: Phương thức đánh dấu vị trí cập nhật cho nhân viên (thực
hiện chưa được).
readStaff:
Tham số: Không
Mô tả: Đọc thông tin nhân viên từ tệp XML.
DeleteStaff:
Tham số: Staff
Mô tả: Xóa một nhân viên và loại bỏ dữ liệu XML tương ứng.
AddStaff:
Tham số: Staff
Mô tả: Thêm một nhân viên mới và cập nhật tệp XML.
CheckStaffID:
17
TinhLuongStaff:
Tham số: int id, string name, DateTime birth, string chucvu,
string gioitinh, int luongngay, int ngaylam
Kiểu trả về: bool
Mô tả: Phương thức đánh dấu vị trí tính lương cho nhân viên
(thực hiện chưa được).
Ghi Chú:
- Lớp ControlStaff quản lý các thao tác liên quan đến nhân viên trong hệ
thống, bao gồm cả các chức vụ như Quản trị viên, Đầu bếp, Thu ngân và
Phục vụ.
- Phương thức readStaff đọc thông tin nhân viên từ file XML và tạo các
đối tượng tương ứng với từng chức vụ, sau đó thêm vào danh sách
chung và danh sách riêng của từng chức vụ.
- Phương thức DeleteStaff xóa một nhân viên khỏi danh sách và cập nhật
file XML. Nó được thực hiện bằng cách xóa phần tử XML tương ứng
với nhân viên đó trong file XML.
- Phương thức AddStaff thêm thông tin của một nhân viên mới vào file
XML.
- Phương thức CheckStaffID kiểm tra xem một ID nhân viên đã tồn tại
chưa.
- Phương thức UpdateStaff cập nhật thông tin của một nhân viên và kiểm
tra xem cập nhật thành công hay không.
- Phương thức SearchStafByName tìm kiếm nhân viên theo tên gần đúng.
g. Lớp ControlTable:
Thuộc Tính:
18
Phương Thức:
Ghi Chú:
- Lớp ControlTable quản lý các thao tác liên quan đến bàn trong hệ thống.
- Phương thức UpdateTableStatus cập nhật trạng thái của một bàn dựa trên
ID, sau đó lưu lại thông tin cập nhật.
- Phương thức CheckTableID kiểm tra xem một ID bàn đã tồn tại chưa.
- Phương thức UpdateTable cập nhật thông tin của một bàn và kiểm tra xem
cập nhật thành công hay không.
- Phương thức SaveChange thêm thông tin của một bàn mới vào file XML.
19
- Phương thức DeleteTable xóa một bàn khỏi danh sách và cập nhật file
XML. Nó được thực hiện bằng cách xóa phần tử XML tương ứng với bàn
đó trong file XML.
- Phương thức WriteTables ghi danh sách các bàn vào file XML.
- Phương thức readTable đọc danh sách các bàn từ file XML.
20
Nút Đăng Nhập (button1):
21
Nút chuyển đến màn hình quản lý Admin (adminToolStripMenuItem).
Nút chuyển chọn màn hình sửa thông tin tài khoản hoặc đăng xuất tài khoản
(thôngTinTàiKhoảnToolStripMenuItem).
Nút chuyển đến màn hình sửa thông tin tài khoản
(thôngTinCáNhânToolStripMenuItem).
22
Hộp thoại chọn món ăn (comboBox1):
Hộp thoại hiển thị tổng tiền của hóa đơn (textBox1):
23
Mỗi bàn có nút để chọn và hiển thị hóa đơn.
24
Hộp thoại hiển thị Tên Đăng Nhập (textBox1):
25
Nút Cập nhật (update):
26
Nút Tra Cứu(ButtonFind):
27
Quản lý món ăn:
Nút Thêm(Thêm):
Nút Sửa(Sửa):
Nút Xóa(Xóa):
28
Trường hiển thị và nhập tên món ăn(textNamefood):
29
Quản lý danh mục món ăn:
Nút Thêm(buttonThêmCate):
Nút Sửa(buttonsửacate):
30
Nút Xóa(buttonxoácate):
31
Nút Thêm(addTable):
Nút Sửa(fixtable):
Nút Xóa(deleTable):
32
Trường hiển thị và nhập loại bàn (textNamefood):
33
Bảng hiển thị thông tin bàn ăn(dataGridView1):
Nút Thêm(addAccount):
34
Nút Sửa(Deleaccount):
Nút Xóa(editAccount):
Trường hiển thị và nhập lương một ngày làm của nhân sự (numericLuongNgay):
Trường hiển thị và nhập số lượng ngày đi làm của nhân sự (numericNgayLam):
35
Trường hiển thị và nhập thông tin ngày sinh của nhân sự(Ngaysinh):
36
Bảng hiển thị thông tin nhân sự (dataGridView4):
Nếu đăng nhập thành công, chuyển đến màn hình quản lý (manager).
Nếu đăng nhập thất bại, hiển thị thông báo và giữ lại trên màn hình đăng nhập.
37
Luồng Quản Lý:
Thêm món vào bàn trống sẽ cập nhập trạng thái bàn.
Chuyển đến màn hình quản lý Admin khi bấm vào admin nếu có quyền
Nếu không có quyền admin sẽ từ chối truy cập và hiển thị thông báo.
38
Chuyển đến màn hình đăng nhập và thoát tài khoản khi bấm Đăng xuất trong
Thông Tin Cá Nhân.
Chuyển đến màn hình đăng nhập và thoát tài khoản khi bấm Thông Tin Cá Nhân
trong Thông Tin Cá Nhân.
39
Luồng Quản Lý Admin:
Chuyển đến các trang Doanh Thu, Món ăn, Doanh Mục, Bàn ăn, Nhân sự khi
bấm vào các nút tương ứng.
Nếu các bước thêm sửa xóa không hợp lệ sẽ hiển thị thông báo lỗi.
40
Phần 3: Các chức năng chính của ứng dụng
-Form1.cs
hashedPassword = BitConverter.ToString(hashedBytes).Replace("-",
"").ToLower();
}
41
this.Hide();
h.ShowDialog();
this.Show();
}
else MessageBox.Show("Đăng nhập thất bại. Tên đăng nhập hoặc mật khẩu
không đúng!");
}
Khi người dung nhập tên tài khoản và mật khẩu vào ô tương ứng trên cửa
sổ đăng nhập và nhấn nút đăng nhập nếu đúng tài khoản và mật khẩu thì sẽ
chuyển đến cửa sổ manager còn trong trường hợp sai mật khẩu hoặc tài khoản
thì sẽ hiện lên cửa sổ thông báo đăng nhập thất bại.
Trong này chúng em sử dụng hàm Authenticate để kiểm tra tài khoản và
mật khẩu có đúng trong dữ liệu đã có hay không và trả về kiểu dữ liệu là bool.
Controlaccount.cs
Ngoài ra hàm khởi tạo của manager được truyền vào 1 Account để định
danh tài khoản đăng nhập, chỉ có Account admin mới có thể truy cập vào cửa sổ
admin.
42
3.2. Chức năng quản lí bàn và hoá đơn.
- Trình bày danh sách các bàn ăn dưới dạng cái nút bấm (button)
-manager.cs
void DisplayTables()
flowLayouttable.Controls.Clear();
table.readTable();
Tag = tableInfo,
Width = 120,
Height = 80,
TextAlign = ContentAlignment.MiddleCenter
43
};
switch (tableInfo.Status)
case (1):
tableButton.BackColor = Color.Aquamarine;
break;
default:
tableButton.Click += TableButton_Click;
flowLayouttable.Controls.Add(tableButton);
-manager.cs
comboBox2.DataSource = null;
44
comboBox2.DataSource =cateList;
comboBox2.DisplayMember = "Name";
- Hiển thị hoá đơn tương ứng với bàn được chọn.
-manager.cs
h.readbill();
m.readbill();
listView1.Items.Clear();
decimal totalCost = 0;
45
if (food != null)
item.SubItems.Add(billInfo.IDfood.ToString());
item.SubItems.Add(billInfo.Quantity.ToString());
item.SubItems.Add((billInfo.Quantity * food.Price).ToString("C")); //
listView1.Items.Add(item);
totalCost += itemCost;
textBox1.Text =
(totalCost-totalCost*numericDiscount.Value/100).ToString() ;
-manager.cs
46
h.readfood();
showbill(idtable);
-manager.cs
h.readbill();
m.readbill();
47
int idbill = h.GetUncheckBillbyTableid(table.ID);
if(idbill!=0)
decimal t = decimal.Parse(textBox1.Text);
h.Checkout(idbill,t);
showbill(table.ID);
UpdateTableStatus(table.ID);
- Truyền vào danh sách thức ăn tương ứng với danh mục thức ăn.
-manager.cs
48
h.readfood();
comboBox1.DataSource = null;
comboBox1.DataSource = foodsByCategory;
comboBox1.DisplayMember = "Name";
-manager.cs
controlBill.readbill();
controlTable.readTable();
DisplayTables();
49
- Nút thanh toán hoá đơn của bàn.
-manager.cs
foodControl.readfood();
h.readbill();
m.readbill();
if(table==null)
if (foodControl.CheckFoodStock(idfood, count))
if (idbill == 0)
50
{
int i = h.GetNextBillID();
h.insertbill(i, table.ID);
foodControl.DecreaseFoodStock(idfood, count);
else
m.MergeDuplicateBillInfo();
foodControl.DecreaseFoodStock(idfood, count);
showbill(table.ID);
UpdateTableStatus(table.ID);
else
MessageBox.Show("Số lượng thức ăn không đủ. Vui lòng kiểm tra lại!");
51
}
-admim.cs
banColumn.DataPropertyName = "IDTable";
banColumn.HeaderText = "Bàn";
dataGridViewBill.Columns.Add(banColumn);
dataGridViewBill.DataSource = null;
dataGridViewBill.Rows.Clear();
dataGridViewBill.DataSource = filteredBills;
admim.cs
52
List<Bill> filteredBills = Crtbill.BillList
LoadFilteredBillsToDataGridView(filteredBills);
ButtonFind_Click(sender, e);
ButtonFind_Click(sender, e);
-admim.cs
List<Bill> GetBillsWithStatus1()
Crtbill.readbill();
53
3.4. Quản lí dữ liệu món ăn.
-admim.cs
dataGridViewFood.DataSource = null;
dataGridViewFood.DataSource = foodList;
-admim.cs
54
crtfood.add(foodadj);
loadFood(crtfood.Foods);
crtfood.savechange(foodadj);
MessageBox.Show("Thêm Thành Công");
}
else MessageBox.Show("Trùng lặp hoặc nhập lỗi");
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
-admim.cs
int id = Convert.ToInt32(numIDfood.Text);
if (crtfood.DeleteFood(id))
loadFood(crtfood.Foods);
if (deleteFood != null)
55
deleteFood(this, new EventArgs());
else
-admim.cs
56
loadFood(crtfood.Foods);
if (updatefood != null)
updatefood(this, new EventArgs());
}
else
{
MessageBox.Show("Có lỗi khi sửa thức ăn");
}
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
-admim.cs
int i = dataGridViewFood.CurrentCell.RowIndex;
foodadj = crtfood.Foods[i];
hienthifood(foodadj);
57
void hienthifood(Food food)
numIDfood.Text = food.ID.ToString();
textNamefood.Text = food.Name;
textfoodcre.Text = food.Category;
numPrice.Value = food.Price;
numstock.Value = food.Stock;
-admim.cs
loadFood(searchResult);
-admim.cs
58
void loadCategory(List<Category> categoryList)
dataGridViewcategory.DataSource = null;
dataGridViewcategory.DataSource = categoryList;
-admim.cs
textBoxidcategory.Text = category.ID.ToString();
textBoxnamecategory.Text = category.Name;
-admim.cs
59
if (crtcategory.CheckCategoryID(ID) &&
crtcategory.CheckCategoryName(Name) && Name!="")
{
crtcategory.add(categoryadj);
loadCategory(crtcategory.Categories);
crtcategory.savechange(categoryadj);
MessageBox.Show("Thêm Thành Công");
}
else MessageBox.Show("Trùng lặp hoặc lỗi");
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
-admim.cs
int id = Convert.ToInt32(textBoxidcategory.Text);
if (crtcategory.DeleteCategory(id))
60
loadCategory(crtcategory.Categories);
if (deletecategory != null)
else
-admim.cs
try
int ID = int.Parse(textBoxidcategory.Text);
if (crtcategory.UpdateCategory(ID, Name))
61
{
loadCategory(crtcategory.Categories);
if (updatecategory != null)
else
MessageBox.Show($"Error: {ex.Message}");
-admim.cs
62
{
dataGridView1.DataSource = tableList;
textBox4.Text = table.ID.ToString();
textBox3.Text = table.Type;
numericUpDown1.Value = table.Seats;
numericUpDown2.Value = table.Status;
-admim.cs
63
int Seats = Convert.ToInt32(numericUpDown1.Value + "");
int Status = Convert.ToInt32(numericUpDown2.Value + "");
tableadj = new Table(ID, Type, Seats, Status);
if (crttable.CheckTableID(ID) && Type!="")
{
crttable.add(tableadj);
loadTable(crttable.Tables);
crttable.SaveChange(tableadj);
MessageBox.Show("Thêm Thành Công");
}
else MessageBox.Show("Trùng lặp hoặc lỗi");
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
-admim.cs
int id = Convert.ToInt32(textBox4.Text);
if (crttable.DeleteTable(id))
64
loadTable(crttable.Tables);
if (deleteTable != null)
else
-admim.cs
65
MessageBox.Show("Sửa thông tin bàn thành công");
loadTable(crttable.Tables);
if (updateTable != null)
updateTable(this, new EventArgs());
}
else
{
MessageBox.Show("Có lỗi khi sửa thông tin bàn");
}
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
}
-admim.cs
66
int luongngay = Convert.ToInt32(numericLuongNgay.Value);
int ngaylam = Convert.ToInt32(numericNgayLam.Value);
string username = textBoxUsername.Text;
string password = textBoxPassword.Text;
int t = ngaylam * luongngay;
if (chucvu == "Administrator")
{
staffadj = new Administrator(id, name, birth, chucvu, gioitinh,
luongngay, ngaylam);
}
else if (chucvu == "Chef")
{
staffadj = new Chef(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else if (chucvu == "Server")
{
staffadj = new Server(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else if (chucvu == "Cashier")
{
staffadj = new Cashier(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else
{
staffadj = new Cashier(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
67
}
if (crtstaff.CheckStaffID(id) && name != "" && chucvu != "" && gioitinh
!= "" && password != "" && username != "" && password.Length >= 8 &&
(staffadj is Administrator || staffadj is Cashier))
{
AddAccountInfo();
crtstaff.add(staffadj);
crtstaff.Staffs.Sort((x, y) => x.ID.CompareTo(y.ID));
loadStaff(crtstaff.Staffs);
crtstaff.AddStaff(staffadj);
MessageBox.Show("Thêm Thành Công");
}
else if (crtstaff.CheckStaffID(id) && name != "" && chucvu != "" &&
gioitinh != "" && (staffadj is Chef || staffadj is Server))
{
crtstaff.add(staffadj);
crtstaff.Staffs.Sort((x, y) => x.ID.CompareTo(y.ID));
loadStaff(crtstaff.Staffs);
crtstaff.AddStaff(staffadj);
MessageBox.Show("Thêm Thành Công");
}
else MessageBox.Show("Trùng lặp hoặc lỗi");
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
}
68
- Sửa nhân viên.
-admim.cs
69
staffadj = new Server(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else if (chucvu == "Cashier")
{
staffadj = new Cashier(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else
{
staffadj = new Cashier(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
if (/*crtstaff.UpdateStaff(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam) &&*/ name != "" && chucvu != "" && gioitinh != "")
{
MessageBox.Show("Sửa nhân viên thành công");
crtstaff.Staffs.RemoveAt(selectedIndex);
loadStaff(crtstaff.Staffs);
crtstaff.DeleteStaff(selectedStaff);
crtstaff.add(staffadj);
crtstaff.Staffs.Sort((x, y) => x.ID.CompareTo(y.ID));
loadStaff(crtstaff.Staffs);
crtstaff.AddStaff(staffadj);
if (updatestaff != null)
updatestaff(this, new EventArgs());
}
else
{
70
MessageBox.Show("Có lỗi khi sửa nhân viên");
}
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
-admim.cs
71
else
{
MessageBox.Show("Vui lòng chọn một nhân sự để xóa");
}
}
-admim.cs
dataGridView4.DataSource = null;
dataGridView4.DataSource = staffList;
-admim.cs
textBoxID.Text = staff.ID.ToString();
textBoxName.Text = staff.Name;
Chucvutext.Text = staff.ChucVu;
textGT.Text = staff.GioiTinh;
numericLuongNgay.Value = staff.LuongNgay;
72
numericNgayLam.Value = staff.NgayLam;
Ngaysinh.Value = staff.Birth;
-admim.cs
-admim.cs
73
{
crtstaff.readStaff();
int selectedIndex = dataGridView4.CurrentCell.RowIndex;
Staff selectedStaff = crtstaff.Staffs[selectedIndex];
h.diemdanhNV(selectedStaff);
crtstaff.UpdateNgayLam(selectedStaff.ID,selectedStaff.NgayLam);
crtstaff.readStaff();
}
-account.cs
void UpdateAccountInfo()
{
string username = textBox1.Text;
string password = textBox3.Text;
string newpass = textBox4.Text;
string reenterPass = textBox5.Text;
string hashedPassword;
string hashedNewPassword;
string hashedReenterPassword;
using (SHA256 sha256 = SHA256.Create())
{
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] hashedBytes = sha256.ComputeHash(passwordBytes);
hashedPassword = BitConverter.ToString(hashedBytes).Replace("-",
"").ToLower();
}
74
using (SHA256 sha256 = SHA256.Create())
{
byte[] passwordBytes = Encoding.UTF8.GetBytes(newpass);
hashedNewPassword = BitConverter.ToString(hashedBytes).Replace("-",
"").ToLower();
}
using (SHA256 sha256 = SHA256.Create())
{
byte[] passwordBytes = Encoding.UTF8.GetBytes(reenterPass);
byte[] hashedBytes = sha256.ComputeHash(passwordBytes);
hashedReenterPassword =
BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
}
if (!newpass.Equals(reenterPass) || newpass.Length < 8)
{
MessageBox.Show("Vui lòng nhập lại mật khẩu đúng với mật khẩu mới!
và mật khẩu mới phải có ít nhất 8 kí tự");
}
else
{
ControlAcc accountControl = new ControlAcc();
// Đọc danh sách tài khoản từ file XML
accountControl.readcate();
if (accountControl.UpdateAccount(username, displayname,
hashedPassword, hashedNewPassword, hashedReenterPassword))
75
{
MessageBox.Show("Cập nhật thành công");
// Phát sự kiện cập nhật tài khoản
if (updateAccount != null)
updateAccount(this, new
AccountEvent(accountControl.Acccouts.Find(acc => acc.UserName ==
username)));
}
else
{
MessageBox.Show("Vui lòng điền đúng mật khẩu");
}
}
UpdateAccountInfo();
76
Phần 4 kết luận
Trong quá trình triển khai đồ án xây dựng ứng dụng quản lý nhà hàng,
chúng em đã tích lũy được nhiều kiến thức quan trọng và phát triển kỹ năng đa
dạng. Việc làm việc với lập trình hướng đối tượng giúp chúng em hiểu rõ về
cách thiết kế và tương tác giữa các đối tượng, trong khi quản lý dữ liệu XML
đưa ra cái nhìn chi tiết về việc lưu trữ thông tin về thực đơn và món ăn, tuy rằng
việc truy xuất dữ liệu vẫn còn gặp một chút khó khan.
Không chỉ giới hạn ở mức cơ bản, đồ án còn đặt ra những thách thức về
thiết kế cơ sở dữ liệu và quản lý chức năng của ứng dụng. Việc xây dựng mô
hình dữ liệu và bảng cơ sở dữ liệu giúp chúng em nắm bắt cách tổ chức thông
tin một cách hiệu quả, trong khi quản lý các chức năng quan trọng như quản lý
thực đơn, hóa đơn và bàn ăn đã tăng cường kỹ năng quản lý và phát triển phần
mềm của chúng em.
Đồng thời, quá trình thiết kế giao diện người dùng không chỉ tập trung
vào khả năng tương tác mà còn chú trọng vào việc làm cho giao diện trở nên
trực quan và dễ sử dụng. Điều này bao gồm việc thiết kế mô hình giao diện và
xây dựng sơ đồ trang và luồng điều hướng.
Ngoài những kỹ năng kỹ thuật, quá trình làm việc nhóm còn giúp chúng
em học cách hợp tác, chia sẻ ý tưởng và giải quyết vấn đề cùng nhau. Đồng thời,
việc tương tác với người dùng cuối cùng giúp chúng em điều chỉnh ứng dụng
dựa trên phản hồi thực tế, tạo ra một sản phẩm phản ánh chính xác nhu cầu của
người sử dụng.
Tổng cộng, đồ án không chỉ là một dự án lập trình mà còn là một hành
trình học tập và phát triển nhiều kỹ năng khác nhau, từ quản lý dự án đến tương
tác với người dùng và thiết kế giao diện người dùng. Chúng em tin rằng ứng
77
dụng quản lý nhà hàng sẽ mang lại giá trị cho cả nhóm phát triển và người sử
dụng cuối cùng.
Đối với định hướng phát triển của ứng dụng quản lý nhà hàng, chúng em
đặt ra một số hướng cụ thể để nâng cao tính linh hoạt và sức mạnh của ứng
dụng:
- Tích hợp Thanh Toán Trực Tuyến: Phát triển tính năng thanh toán trực
tuyến để tối ưu hóa quá trình thanh toán và cải thiện trải nghiệm người
dùng.
- Phân Quyền và Đăng Nhập Nhân Viên: Xây dựng hệ thống quản lý người
dùng với các mức độ quyền khác nhau cho nhân viên, quản lý và quản trị
viên.
- Thống Kê và Báo Cáo: Mở rộng khả năng thống kê và báo cáo để cung
cấp thông tin chi tiết về doanh thu, mức độ sử dụng bàn, và món ăn phổ
biến.
- Tích Hợp Hệ Thống Đặt Bàn Online: Tạo tính năng đặt bàn trực tuyến để
khách hàng có thể dễ dàng đặt chỗ qua ứng dụng di động hoặc trang web.
- Tối Ưu Hóa Giao Diện Người Dùng di động: Phát triển ứng dụng di động
hoàn chỉnh hoặc tối ưu hóa giao diện để đảm bảo trải nghiệm người dùng
mượt mà trên các thiết bị di động.
- Bảo Mật và Tuân Thủ Pháp Luật: Tăng cường bảo mật hệ thống và đảm
bảo tuân thủ các quy định pháp luật liên quan đến quản lý thông tin cá
nhân và thanh toán trực tuyến.
- Những hướng phát triển này sẽ giúp ứng dụng không chỉ đáp ứng nhu cầu
hiện tại mà còn mở rộng khả năng và tính năng để đáp ứng những thách
thức và cơ hội trong tương lai.
78