Tổng quan về đề tài HotelMini -Phát biểu bài toán: Xây dựng một hệ thống phần mềm quản lý cho một “Khách sạn mini” (Hotel Mini) cho phép quản lý thông tin: khách hàng, phòng, nhân viên, và hóa đơn. Hệ thống phải hỗ trợ thao tác thêm/sửa/xóa/danh sách, tìm kiếm, lưu/đọc dữ liệu từ file và thống kê doanh thu. -Lý do chọn: Khách sạn nhỏ/nhà nghỉ/nhà trọ là một bài toán điển hình cho OOP: có nhiều thực thể (khách hàng, phòng, nhân viên, hóa đơn) tương tác với nhau; cần lưu trữ bền vững; có nghiệp vụ (đặt phòng, thanh toán, thống kê) phù hợp để thể hiện kế thừa, đóng gói, đa hình, và xử lý file
- Hệ Thống Xác Thực Dựa Trên Vai Trò: Đăng nhập/đăng ký với ba vai trò (Admin, Nhân Viên, Khách Hàng)
- Quản Lý Khách Hàng: Thêm, liệt kê, sửa và xóa hồ sơ khách hàng với thông tin cá nhân
- Quản Lý Nhân Viên: Quản lý nhân viên khách sạn với thông tin vị trí và lương
- Quản Lý Phòng: Duy trì kho phòng với giá và trạng thái sẵn có
- Quản Lý Hóa Đơn: Tạo và quản lý hóa đơn khách hàng với theo dõi tự động trạng thái phòng
- Chức Năng Tìm Kiếm Nâng Cao: Tìm kiếm khách hàng theo tên/ngày sinh, phòng theo ID, hóa đơn theo ID/ngày nhận/ngày trả/khoảng ngày
- Thống Kê: Xem báo cáo doanh thu, khách hàng hàng đầu, số hóa đơn theo nhân viên, nhân viên hàng đầu theo lương
- Lưu Trữ Dữ Liệu: Tất cả dữ liệu được tự động lưu vào các tệp CSV trong thư mục
data/ - Tự Động Nâng Cấp Nhân Viên: Khi đăng ký với CCCD của nhân viên, tài khoản tự động được nâng cấp lên vai trò Nhân Viên
Person (Lớp Cơ Sở Trừu Tượng)
├── Customer (Khách Hàng)
└── Employee (Nhân Viên)
Room (Phòng - Độc Lập)
Invoice (Hóa Đơn - Độc Lập)
HotelManager (Lớp Quản Lý Chính - Độc Lập)
Account (Tài Khoản - Độc Lập)
AuthManager (Quản Lý Xác Thực - Độc Lập)
Lớp cơ sở cho tất cả những người trong hệ thống.
Thuộc Tính:
cccd(chuỗi): Số CCCDname(chuỗi): Họ và tênphone(chuỗi): Số điện thoạiemail(chuỗi): Địa chỉ email
Phương Thức:
getCccd(),getName(),getPhone(),getEmail(): Các hàm lấy dữ liệusetName(),setPhone(),setEmail(): Các hàm đặt dữ liệutoCSV(): Chuyển đổi sang định dạng CSV (thuẩn ảo)fromCSV(): Phân tích từ định dạng CSV (thuần ảo)
Đại diện cho một khách hàng khách sạn.
Được kế thức toàn bộ thuộc tính và phương thức lấy từ person(Lớp cha)
Thuộc Tính Bổ Sung:
birthdate(chuỗi): Ngày sinh (định dạng YYYY-MM-DD)address(chuỗi): Địa chỉ cư trú
Phương Thức Mới:
getBirthdate(),getAddress(): Các hàm lấy dữ liệutoCSV(),fromCSV(): Tuần tự hóa CSV
Đại diện cho một nhân viên khách sạn.
Được kế thức toàn bộ thuộc tính và phương thức lấy từ person(Lớp cha)
Thuộc Tính Bổ Sung:
position(chuỗi): Vị trí công việc (ví dụ: Quản Lý, Lễ Tân)salary(số thực): Lương hàng tháng
Phương Thức Mới:
getPosition(),getSalary(): Các hàm lấy dữ liệutoCSV(),fromCSV(): Tuần tự hóa CSV
Đại diện cho một phòng khách sạn.
Thuộc Tính:
roomId(chuỗi): Mã phòng duy nhất (ví dụ: R101, R202)type(chuỗi): Loại phòng (ví dụ: Đơn, Đôi, Gia Đình)price(số thực): Giá mỗi đêmavailable(boolean): Trạng thái sẵn có (true = có sẵn, false = đã đặt)
Phương Thức:
getRoomId(),getType(),getPrice(),isAvailable(): Các hàm lấy dữ liệusetAvailable(): Đặt trạng thái sẵn cótoCSV(),fromCSV(): Tuần tự hóa CSV
Đại diện cho một đơn đặt phòng/hóa đơn khách hàng.
Thuộc Tính:
invoiceId(chuỗi): Mã hóa đơn duy nhấtcustomerCccd(chuỗi): Tham chiếu đến CCCD khách hàngemployeeCccd(chuỗi): Tham chiếu đến CCCD nhân viên tạo hóa đơnroomId(chuỗi): Tham chiếu đến phòng được đặtdateFrom(chuỗi): Ngày nhận phòng (YYYY-MM-DD)dateTo(chuỗi): Ngày trả phòng (YYYY-MM-DD)total(số thực): Tổng số tiền tính phí
Phương Thức:
getInvoiceId(),getCustomerCccd(),getEmployeeCccd(),getRoomId(),getDateFrom(),getDateTo(),getTotal(): Các hàm lấy dữ liệutoCSV(),fromCSV(): Tuần tự hóa CSV
Đại diện cho một tài khoản người dùng trong hệ thống xác thực.
Thuộc Tính:
username(chuỗi): Tên đăng nhập duy nhấtpassword(chuỗi): Mật khẩu (lưu trữ dạng văn bản cho mục đích demo)role(số nguyên): Vai trò người dùng (0 = Admin, 1 = Nhân Viên, 2 = Khách Hàng)cccd(chuỗi): CCCD liên kết (trống cho Admin)
Phương Thức:
getUsername(),getPassword(),getRole(),getCccd(): Các hàm lấy dữ liệutoCSV(),fromCSV(): Tuần tự hóa CSV
Lớp quản lý trung tâm điều phối tất cả các hoạt động của chương trình.
Thuộc Tính:
dataDir(chuỗi): Đường dẫn đến thư mục dữ liệucustomers(vector): Tất cả khách hàngemployees(vector): Tất cả nhân viênrooms(vector): Tất cả phònginvoices(vector): Tất cả hóa đơncurrentUser(Account): Tài khoản người dùng hiện tại đã đăng nhập
Phương Thức Chính:
loadAll(),saveAll(): Tải/lưu tất cả dữ liệuhomeMenu(): Menu đăng nhập/đăng kýadminMenu(),staffMenu(),customerMenu(): Các menu dựa trên vai tròemployeeMenu(),roomMenu(),invoiceMenu(): Các hàm menu quản lýsearchMenu(),statsMenu(): Các hàm tìm kiếm và thống kêrunConsole(): Vòng lặp bảng điều khiển chính
HotelMini/
├── CMakeLists.txt # Cấu hình xây dựng CMake
├── README.md # Tệp này
├── main.cpp # Điểm vào chương trình
├── build/ # Thư mục đầu ra xây dựng (được tạo)
│ └── bin/
│ └── HotelMini.exe # Tệp thực thi đã biên dịch
├── data/ # Lưu trữ dữ liệu (tệp CSV)
│ ├── accounts.txt # Dữ liệu tài khoản người dùng
│ ├── customers.txt # Dữ liệu khách hàng
│ ├── employees.txt # Dữ liệu nhân viên
│ ├── rooms.txt # Dữ liệu phòng
│ └── invoices.txt # Dữ liệu hóa đơn
└── src/
├── manager/
│ ├── HotelManager.h
│ ├── HotelManager.cpp
│ ├── AuthManager/ # Quản lý xác thực
│ │ ├── AuthManager.h
│ │ └── AuthManager.cpp
│ └── menus/ # Triển khai menu
│ ├── CustomerMenu/ # Menu quản lý khách hàng
│ ├── EmployeeMenu/ # Menu quản lý nhân viên
│ ├── RoomMenu/ # Menu quản lý phòng
│ ├── InvoiceMenu/ # Menu quản lý hóa đơn
│ ├── SearchMenu/ # Menu tìm kiếm
│ └── StatsMenu/ # Menu thống kê
├── models/ # Các lớp mô hình dữ liệu
│ ├── Person/ # Lớp Người
│ ├── Customer/ # Lớp Khách Hàng
│ ├── Employee/ # Lớp Nhân Viên
│ ├── Room/ # Lớp Phòng
│ ├── Invoice/ # Lớp Hóa Đơn
│ └── Account/ # Lớp Tài Khoản
└── utils/ # Các hàm tiện ích
├── DateUtils/ # Tiện ích xử lý ngày tháng
└── StringUtils/ # Tiện ích xử lý chuỗi
- CMake: Phiên bản 3.16 trở lên
- Trình Biên Dịch C++: MinGW g++ 13.2.0 hoặc trình biên dịch C++17 tương thích
- Hệ Điều Hành: Windows (với MinGW đã cài đặt)
Mở cmd window và copy lệnh sau
git clone https://github.com/CallingSun/Gaylgbt.gitNOTE: Đường nhiên là nếu bạn đã được chủ dự án cho phép vào repo mới clone được còn không thì phải chịu!
cd C:\Users\<tên_người_dùng>\..\HotelMini Hoặc
cd D:\..\HotelMiniTuỳ thuộc vào việc bạn clone về đâu
mkdir build
cd buildcmake -S .. -B . -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debugcmake --build .Tệp thực thi đã biên dịch sẽ được đặt tại: build\bin\HotelMini.exe
cd "..\..\HotelMini"; .\build\bin\HotelMini.exeHãy thay dấu .. bằng đường dẫn đến thư mục HotelMini của bạn
Lưu Ý: Nếu đường dẫn dự án của bạn chứa các ký tự không phải ASCII (ví dụ: các ký tự tiếng Việt như "Máy tính"), MinGW g++ có thể gặp sự cố mã hóa. Sử dụng giải pháp thay thế này:
-
Sao chép dự án đến một đường dẫn tạm thời chỉ có ASCII:
Copy-Item -Recurse "C:\Users\<tên_người_dùng>\OneDrive\Máy tính\HotelMini" "C:\temp\HotelMini"
-
Xây dựng tại vị trí tạm thời:
cd C:\temp\HotelMini mkdir build cd build cmake -S .. -B . -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug cmake --build .
-
Sao chép tệp thực thi trở lại vị trí ban đầu:
Copy-Item -Force "C:\temp\HotelMini\build\bin\HotelMini.exe" "C:\Users\<tên_người_dùng>\OneDrive\Máy tính\HotelMini\build\bin\HotelMini.exe"
Nhắc lại lần nữa cho nhớ cách chạy
cd "..\..\HotelMini"; .\build\bin\HotelMini.exeNOTE: TIÊN QUYẾT PHẢI ĐÚNG ĐƯỜNG DẪN ĐẾN THƯ MỤC HOTELMINI
Khi khởi động chương trình, bạn sẽ thấy Menu Chính:
=== QUAN LY HOTEL MINI ===
1. Dang nhap (Đăng Nhập)
2. Dang ky (Đăng Ký)
3. Doi mat khau (Đổi Mật Khẩu)
4. Quen mat khau (Quên Mật Khẩu)
0. Thoat chuong trinh (Thoát Chương Trình)
- Nhập tên đăng nhập và mật khẩu
- Hệ thống xác thực tài khoản và tải menu dựa trên vai trò của bạn
- Nhập tên đăng nhập, mật khẩu và CCCD
- Tự Động Nâng Cấp Nhân Viên: Nếu CCCD khớp với nhân viên trong hệ thống, tài khoản sẽ tự động được tạo với vai trò Nhân Viên (1)
- Nếu CCCD khớp với khách hàng hoặc không tồn tại, tài khoản sẽ được tạo với vai trò Khách Hàng (2)
- Yêu cầu: Phải đăng nhập trước
- Áp dụng cho: Nhân Viên (Vai Trò 1) và Khách Hàng (Vai Trò 2)
- Quy trình:
- Nhập mật khẩu hiện tại (xác minh)
- Nhập mật khẩu mới
- Hệ thống xác thực mật khẩu cũ và cập nhật mật khẩu mới
- Hiển thị thông báo thành công hoặc lỗi
- Yêu cầu: KHÔNG cần đăng nhập
- Áp dụng cho: Nhân Viên (Vai Trò 1) và Khách Hàng (Vai Trò 2) KHÔNG áp dụng cho Admin (Vai Trò 0)
- Quy trình:
- Nhập tên đăng nhập
- Nhập CCCD (xác minh danh tính)
- Hệ thống xác thực CCCD khớp với tài khoản
- Mật khẩu được đặt lại thành tên đăng nhập
- Hiển thị thông báo thành công hoặc lỗi
- Tên đăng nhập:
admin - Mật khẩu:
htpp200 - Vai trò: Admin (0) - Toàn quyền truy cập
Admin có toàn quyền truy cập tất cả các chức năng:
=== Quan Li Hotel Mini ===
1. Quan ly khach hang (Quản Lý Khách Hàng)
2. Quan ly nhan vien (Quản Lý Nhân Viên)
3. Quan ly phong (Quản Lý Phòng)
4. Quan ly hoa don (Quản Lý Hóa Đơn)
5. Tim kiem (Tìm Kiếm)
6. Thong ke (Thống Kê)
0. Luu & Thoat (Lưu & Thoát)
Nhân viên có quyền truy cập hạn chế:
=== Menu Nhan Vien ===
1. Quan ly khach hang (Quản Lý Khách Hàng)
2. Quan ly hoa don (Quản Lý Hóa Đơn)
3. Doi mat khau (Đổi Mật Khẩu)
4. Quen mat khau (Quên Mật Khẩu)
0. Dang xuat (Đăng Xuất)
Khách hàng chỉ có thể xem thông tin cá nhân:
=== Menu Khach Hang ===
1. Xem thong in ca nhan (Xem Thông Tin Cá Nhân)
2. Xem hoa don (Xem Hóa Đơn Của Tôi)
3. Doi mat khau (Đổi Mật Khẩu)
4. Quen mat khau (Quên Mật Khẩu)
0. Dang xuat (Đăng Xuất)
Quản Lý Khách Hàng:
-
- Thêm khách hàng
-
- Liệt kê khách hàng
-
- Sửa khách hàng theo CCCD
-
- Xóa khách hàng theo CCCD
-
- Quay lại
Quản Lý Nhân Viên:
-
- Thêm nhân viên
-
- Liệt kê nhân viên
-
- Sửa nhân viên theo CCCD
-
- Xóa nhân viên theo CCCD
-
- Quay lại
Quản Lý Phòng:
-
- Thêm phòng
-
- Liệt kê phòng
-
- Xem chi tiết phòng
-
- Sửa phòng
-
- Xóa phòng
-
- Quay lại
Quản Lý Hóa Đơn:
-
- Tạo hóa đơn
-
- Liệt kê hóa đơn
-
- Xóa hóa đơn
-
- Quay lại
Tìm Kiếm:
-
- Tìm kiếm khách hàng theo tên
-
- Tìm kiếm khách hàng theo ngày sinh
-
- Tìm kiếm khách hàng theo khoảng ngày sinh
-
- Tìm kiếm phòng theo mã
-
- Tìm kiếm hóa đơn theo mã
-
- Tìm kiếm hóa đơn theo ngày nhận
-
- Tìm kiếm hóa đơn theo ngày trả
-
- Tìm kiếm hóa đơn theo khoảng ngày
-
- Quay lại
Thống Kê:
-
- Tổng doanh thu
-
- Doanh thu theo khoảng ngày
-
- Top khách hàng chi nhiều
-
- Số hóa đơn theo nhân viên
-
- Top nhân viên theo lương
-
- Quay lại
Tất cả dữ liệu được lưu trữ ở định dạng CSV (Giá Trị Được Phân Tách Bằng Dấu Phẩy) trong thư mục data/. Mỗi tệp được tự động tạo và cập nhật khi bạn chạy chương trình.
Định Dạng: TênĐăngNhập,MậtKhẩu,VaiTrò,CCCD
Ví Dụ:
admin,htpp200,0,
user1,ggwp,2,011206000500
ngou,haha,1,012911291211
Lưu Ý:
VaiTrò:0= Admin,1= Nhân Viên,2= Khách HàngCCCD: Trống cho Admin, chứa CCCD của nhân viên/khách hàng cho các vai trò khác- Mật khẩu được lưu dạng văn bản (chỉ cho mục đích demo, không an toàn cho sản xuất)
Định Dạng: CCCD,Tên,SĐT,Email,NgàySinh,ĐịaChỉ
Ví Dụ:
012345678901,Le Quang Luyen,0912345678,[email protected],1990-01-01,Hanoi
016532300860,Pham Hai Hoan,0949058119,[email protected],2006-05-02,Ha Noi
Định Dạng: CCCD,Tên,SĐT,Email,VịTrí,Lương
Ví Dụ:
089999999999,Tran Thi Dan,0901112222,[email protected],Manager,1200
077777777777,Pham Thi Phuong Dung,0912223333,[email protected],Receptionist,800
01222031031,Pham Ba loc,11022131331,[email protected],Manager,1000
Định Dạng: MãPhòng,LoạiPhòng,Giá,SẵnCó
Ví Dụ:
R101,Single,180,1
R102,Double,270,1
R203,Family,450,1
R304,Double,300,0
Lưu Ý: SẵnCó là 1 (có sẵn) hoặc 0 (đã đặt)
Định Dạng: MãHóaĐơn,CCCDKHÁCH,CCCDNV,MãPhòng,NgàyNhận,NgàyTrả,TổngTiền
Ví Dụ:
INV001,011077891500,012911291211,R001,2025-11-25,2025-12-01,1500
INV002,011206000500,011129800921,R002,2025-12-11,2025-12-25,3500
Lưu Ý: CCCDNV là CCCD của nhân viên tạo hóa đơn
- Tất cả các ngày đều ở định dạng YYYY-MM-DD
- CCCD (Căn Cước Công Dân) được sử dụng làm mã định danh duy nhất cho khách hàng và nhân viên
- Trạng thái sẵn có của phòng được quản lý tự động khi hóa đơn được tạo hoặc xóa
- Tất cả dữ liệu được lưu vào các tệp CSV khi bạn chọn "Lưu & Thoát" từ menu chính
- Hệ thống sử dụng tiếng Việt cho các lời nhắc menu và thông báo
- Hệ thống xác thực dựa trên vai trò (RBAC) kiểm soát quyền truy cập của người dùng
- Khi đăng ký, nếu CCCD khớp với nhân viên trong hệ thống, tài khoản sẽ tự động được nâng cấp lên vai trò Nhân Viên
Các tính năng đã được triển khai:
- ✅ Hệ thống xác thực dựa trên vai trò (Admin, Nhân Viên, Khách Hàng)
- ✅ Tự động nâng cấp nhân viên khi đăng ký với CCCD nhân viên
- ✅ Tìm kiếm nâng cao theo khoảng ngày (khách hàng theo ngày sinh, hóa đơn theo ngày nhận/trả/khoảng ngày)
- ✅ Thống kê nâng cao (doanh thu theo khoảng ngày, số hóa đơn theo nhân viên, top nhân viên theo lương)
- ✅ Chức năng sửa thông tin (khách hàng, nhân viên, phòng)
- ✅ Chức năng đổi mật khẩu (Đổi Mật Khẩu) - Yêu cầu đăng nhập, áp dụng cho Nhân Viên (Vai Trò 1) và Khách Hàng (Vai Trò 2)
- ✅ Chức năng quên mật khẩu (Quên Mật Khẩu) - Không yêu cầu đăng nhập, áp dụng cho Nhân Viên (Vai Trò 1) và Khách Hàng (Vai Trò 2), reset mật khẩu về tên đăng nhập
Các tính năng có thể cải tiến thêm:
- Mã hóa mật khẩu (hiện tại lưu dạng văn bản cho mục đích demo sử dụng sha256 với c++ hoặc bycryt)
- Thêm chức năng đặt phòng trực tiếp cho khách hàng
- Thêm chức năng chấm công cho nhân viên
- Thêm chức năng tính lương tự động
- Thêm chức năng xuất báo cáo PDF
- Thêm chức năng sao lưu/khôi phục dữ liệu(Nói cách khác là ẩn hiện lại các dữ liệu)
- Thêm chức năng quản lý dịch vụ phòng (mini bar, dọn phòng, v.v.)
Dự án này là một phần của bài tập giáo dục về hệ thống quản lý khách sạn bạn có thể thoải mái sửa đổi và cải thiện mã nguồn của dự án này.
Tại sao lại là std: Bình thường nếu như ta chỉ code trong cùng 1 file (single code file) thì việc sử dụng using namespace std; là không vấn đề gì. Nhưng khi ta code trong nhiều file (multi code file) thì việc sử dụng using namespace std; sẽ dễ gây ra lỗi biến cục bộ. Vì vậy ta phải sử dụng std:: để tránh lỗi.
Tại sao các hàm lại đặt tên bằng tiếng Anh Cuộc sống đơn giản là khi bạn biết hệ thống nước ngoài dùng thế nào :DD
Hùng có bị gay lgbt không? Chắc chắn là có
Nếu cô Hương đọc đến đây thì em nể cô thật đấy