Trong số đó các phần mềm trên nền tảng di dộng được ưa chuộng và sửdụng phổ biến.Trong lĩnh vực kinh doanh nhà hàng, quán ăn,thông thường khi gọi móntrong nhà hàng, khách hàng có thể gọi
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
BÁO CÁO CUỐI KỲ
LẬP TRÌNH DI ĐỘNGĐề tài:
XÂY DỰNG APP ĐẶT MÓN ĂN TẠI NHÀ HÀNG
Giảng viên hướng dẫn: PGS TS VŨ SONG TÙNG
Nhóm sinh viên thực hiện:
Hà Nội, tháng 7 - 2022
Trang 2LỜI NÓI ĐẦU
Ngày nay, khi ngày càng có nhiều sự phát triển tiến bộ của công nghệthông tin, các phần mềm đều được thiết kế để hướng đến đa nền tảng, đa thiếtbị Trong số đó các phần mềm trên nền tảng di dộng được ưa chuộng và sửdụng phổ biến.
Trong lĩnh vực kinh doanh nhà hàng, quán ăn,thông thường khi gọi móntrong nhà hàng, khách hàng có thể gọi món trực tiếp tại quầy thu ngân hoặc khikhách ngồi nhân viên đến tận nơi đưa thực đơn cho khách hỏi xem khách muốndùng đồ ăn,thức uống gì rồi ghi chép để thông báo nhà bếp chế biến Nếukhách muốn đổi món hoặc order nhiều lần sẽ gây phức tạp cho quá trình phụcvụ và tốn kém nhiều thời gian đi lại
Để giúp các nhà hàng, quán ăn loại bỏ các vấn đề đó nhóm 6 chúng emquyết định lựa chọn đề tài xây dựng ứng dụng order món ăn trên nền tảng diđộng Không chỉ giúp cho việc gọi món và phục vụ món dễ dàng hơn, ứng dụngcòn giúp các quản lý quản lý hệ thống, nhân viên, bàn ăn và món ăn dễ dànghơn Đồng thời, ứng dụng cũng giúp nhân viên tránh nhầm lẫn trong việc tínhtoán
Trang 3MỤC LỤC
DANH MỤC HÌNH VẼ i
DANH MỤC BẢNG BIỂU ii
CHƯƠNG 1 TỔNG QUAN VỀ ĐỀ TÀI 1
1.1 Giới thiệu về đề tài 1
1.2 Các tính năng của chương trình 1
1.3 Tính hữu dụng của phần mềm 2
1.4 Công cụ lập trình Android Studio 2
1.5 Kết luận chương 2
CHƯƠNG 2 THIẾT KẾ HỆ THỐNG 3
2.1 Thiết kế cơ sở dữ liệu 3
2.1.1 Sơ đồ khối chức năng 3
2.1.2 Các thực thể trong cơ sở dữ liệu 4
Trang 4DANH MỤC HÌNH V
Hình 2.1 Sơ đồ khối chức năng 3
Hình 2.2 Sơ đồ thực thể liên kết 8
Hình 2.3 Cấu trúc thư mục java 9
Hình 2.4 Cấu trúc thư mục res 9
Hình 2.5 Cấu trúc thư mục drawable 10
Hình 2.6 Cấu trúc thư mục layout 11
Hình 2.7 Cấu trúc thư mục values 12
Hình 2.8 Cấu trúc thư mục anim 12
Hình 2.9 Cấu trúc thư mục menu 13
Hình 2.10 Cấu trúc thư mục manifests 13
Hình 2.11 Cấu trúc Gradle Scripts 14
Hình 3.1 Màn hình đăng nhập app 27
Hình 3.2 Màn hình đăng ký nhân viên mới 28
Hình 3.3 Màn hình danh sách nhân viên 29
Hình 3.4 Màn hình chức năng sửa xóa nhân viên 30
Hình 3.5 Màn hình sửa thông tin nhân viên 31
Hình 3.6 Màn hình danh sách bàn ăn 32
Hình 3.7 Màn hình hiển thị thực đơn 33
Hình 3.8 Màn hình danh sách món ăn 33
Hình 3.9 Popup thêm bàn ăn 34
Hình 3.10 Popup sửa bàn ăn 35
Trang 5DANH MỤC BẢNG B
Bảng 2.1 Bảng thông tin nhân viên 5
Bảng 2.2 Bảng thông tin bàn 6
Bảng 2.3 Bảng thông tin món ăn 6
Bảng 2.4 Bảng thông tin loại món ăn 7
Bảng 2.5 Bảng thông tin quyền 7
Bảng 2.6 Bảng thông tin gọi món 7
Bảng 2.7 Bảng chi tiết gọi món 8
Trang 6CHƯƠNG 1 TỔNG QUAN VỀ ĐỀ TÀI
Chương 1 sẽ giới thiệu tổng quan về mục tiêu, các tính năng và yêu cầu đề tài
1.1 Giới thiệu về đề tài
Tên đề tài: Ứng dụng chọn món ăn dành cho nhà hàng Phạm vi sử dung: trong các nhà hàng, quán ănĐối tượng sử dụng: nhân viên nhà hàng
Mục tiêu: Tạo ra một ứng dụng có khả năng quản lý nhân viên đồng thời trợgiúp nhân viên order thức ăn, giảm thời gian order món ăn, giảm sai sót trongkhâu đặt/trả tiền món ăn, giúp tự động hóa và tối ưu hóa lợi nhuận
Yêu cầu: giao diện dễ hiểu đối với những người mới tiếp cận lần đầuYêu cầu thiết kế
Yêu cầu chức năng:
o User có quyền có thể thay đổi thông tin món ăno Có thể thêm, sửa, xóa nhân viên, bàn ăn, món ăn
o Hiển thị được danh sách nhân viên, hiển thị bàn ăn và các loại món ăno Các món ăn đi kèm với thông tin: giá, hình ảnh.
o Sau khi chốt món hiện ra bảng hoá đơn nhưng vẫn có thể tiếp tục chọnmón
o Có thể chọn món và huỷ mónYêu cầu phi chức năng:
o Sử dụng phần mềm Android Studioo Hệ thống có tính bảo mật và phân quyềno Giao diện dễ sử dụng, không bị nhầm lẫno Ứng dụng được dùng trên điện thoại hoặc tablet
1.2 Các tính năng của chương trình
Nhân viên sẽ sử dụng một smartphone chạy Android có cài đặt ứng dụng trênđó Khách hàng sẽ chọn bàn, chọn món trên Menu, sau đó nhân viên sẽ nhậpthông tin vào ứng dụng Thông tin sẽ được gửi đến máy quản lí và thực hiệntheo yêu cầu của khách hàng.
Khi khách hàng ra về thanh toán, hóa đơn và thông tin từ máy quản lí sẽ đượcgửi đến máy điện thoại của nhân viên và hoàn thành quá trình thanh toán chokhách hàng.
Trang 71.4 Công cụ lập trình Android Studio
Các thành phần:
Test Modules: Những modules này chứa mã để kiểm tra ứng dụng và xây dựngbên trong ứng dụng kiểm tra mà nó chạy trên thiết bị Mặc định, Android studiotạo ra androidTest module chèn trong JUnit tests.
Library Modules: Những modules này chứa các mã nguồn có thể chia sẻ trongứng dụng Android và nguồn tài nguyên đó ta có thể tham chiếu đến dự ánAndroid Điều này rất hữu ích khi chúng ta muốn sử dụng lại mã nguồn.Library modules không được cài đặt trên thiết bị, tuy nhiên chúng được nhúngtrong tập tin apk tại thời điểm build tập tin apk.
App Engine Module: Dùng để thêm thuộc tính điện toán đám mây đến Thuộctính này cho phép chúng ta áp dụng các chức năng như sao lưu dữ liệu ngườidùng tới điện toán đám mây, nội dung máy chủ tới thiết bị di động, tương tácthời gian thực.
Android Application Modules: Các modules của ứng dụng Android được baogồm trong tệp tin apk tệp tin cơ sở trên việc cài đặt hệ thống build Chúngchứa các thứ của ứng dụng như mã nguồn, các tệp tin nguồn Hầu hết mãnguồn và các tệp tin nguồn được sinh ra bởi mặc định.
Trang 82.1 Thiết kế cơ sở dữ liệu
2.1.1 Sơ đồ khối chức năng.
Hình 2.1 Sơ đồ khối chức năng
Nếu nhấn vào xóa thì sẽ xóa nhân viên đó.
Cũng trong hiển thị danh sách nhân viên có nút thêm nhân viên (đăng ký) khi nhấnvào thì sẽ hiện lên một màn hình cho phép thêm mới một nhân viên.
Món ăn
Ban đầu, người dùng cần thêm các loại món ăn Sau khi đã có các loại món ăn,người dùng có thể thêm các món ăn thuộc các loại món ăn đó với giá tiền đi kèm.
Bàn ăn
Trang 9Trong hiển thị bàn ăn khi nhấn giữ bàn ăn nào đó sẽ xuất hiện lên option menu cólựa chọn sửa.
Nếu nhấn vào sửa thì sẽ hiện lên màn hình cho phép sửa tên của bàn ăn.
Cũng trong hiển thị bàn ăn có nút thêm bàn ăn khi nhấn vào thì sẽ xuất hiện lênmột popup để nhập tên bàn ăn mới.
Gọi món, thanh toán
Trong hiển thị bàn ăn khi nhấn vào bàn ăn nào đó sẽ xuất hiện các nút gọi món vàthanh toán.
Khi nhấn vào nút gọi món thì màn hình sẽ chuyển đến màn hình loại thực đơn vàkhi nhấn vào trong đó có thể chọn được món ăn Và trạng thái sẽ chuyển về bàn đãđược gọi.
Nếu thêm món ăn mà đã gọi trước đó thì sẽ cộng dồn số lượng món ăn đó, ngượclại thì ghi mới vào danh sách.
Nếu nhấn nút thanh toán thì sẽ xóa danh sách các món đã được gọi và trạng thái sẽchuyển về bàn chưa được gọi.
2.1.2 Các thực thể trong cơ sở dữ liệu
Thực thể Nhân Viên bao gồm các thuộc tính:
o Mã nhân viêno Tên đăng nhậpo Mật khẩuo Giới tínho Ngày sinh
o Chứng minh nhân dâno Mã quyền
Thực thể Bàn ăn bao gồm các thuộc tính: o Mã bàn ăn
o Tên bàn ăno Tình trạng
Thực thể Món ăn bao gồm các thuộc tính: o Mã món ăn
o Tên món ăno Mã loại món ăno Giá tiềno Hình ảnh
Trang 10Thực thể Loại món bao gồm các thuộc tính: o Mã loại món ăn
o Tên loại món ăn
Thực thể Quyền bao gồm các thuộc tính: o Mã quyền
o Tên quyền
Thực thể Gọi món bao gồm các thuộc tính: o Mã gọi món
o Mã bàno Mã nhân viêno Ngày gọi móno Tình trạng
Thực thể Chi tiết gọi món bao gồm các thuộc tính: o Mã gọi món
o Mã món ăno Số lượng2.1.3 Thiết kế dữ liệuHệ thống gồm các bảng sau
o Bảng NHANVIEN (Nhân viên): lưu thông tin nhân viên
Bảng 2.1 Bảng thông tin nhân viên
o Bảng BANAN (Bàn ăn): lưu thông tin bàn
Trang 11Bảng 2.2 Bảng thông tin bàn
o Bảng MONAN (Món ăn): lưu thông tin món ăn
Bảng 2.3 Bảng thông tin món ăn
o Bảng LOAIMON (Loại món): lưu thông tin loại món ăn
Bảng 2.4 Bảng thông tin loại món ăn
o Bảng QUYỀN (Quyền): lưu thông tin quyền
Trang 12Bảng 2.5 Bảng thông tin quyền
o Bảng GOIMON (Gọi món): lưu thông tin gọi món
Bảng 2.6 Bảng thông tin gọi món
o Bảng CHITIETGOIMON (Chi tiết gọi món): lưu thông tin chi tiết gọimón
Bảng 2.7 Bảng chi tiết gọi món
TBLCHITIETGOIMON
Trang 132.1.4 Sơ đồ thực thể liên kết
Hình 2.2 Sơ đồ thực thể liên kết2.2 Cấu trúc Android Project
2.2.1 Thư mục java
Thư mục này sẽ chứa tất cả các file mã nguồn java (.java) sẽ tạo trong quá trìnhphát triển ứng dụng Đối với ứng dụng này, thư mục java bao gồm mã nguồn java củacác lớp DTO, DAO, database và các activity trong ứng dụng.
Trang 14Hình 2.6 Cấu trúc thư mục layout
2.2.2.3 Thư mục values
Thư mục này sẽ chứa một số file XML khác nhau, chẳng hạn như strings, colors,styles.
Trang 15Hình 2.7 Cấu trúc thư mục values
Trang 16Hình 2.9 Cấu trúc thư mục menu
2.2.3 Thư mục manifests
Thư mục này sẽ chứa một file Manifest (AndroidManifest.xml) cho ứng dụngAndroid File manifest này sẽ chứa thông tin về ứng dụng (Android version, accesspermissions, metadata và các component của ứng dụng) File manifest sẽ hoạt độngnhư một trung gian giữa hệ điều hành Android và ứng dụng
Hình 2.10 Cấu trúc thư mục manifests
2.2.4 Gradle Scripts
Trong Android, Gradle là công cụ build hệ thống và Gradle được tích hợp sẵn vàoAndroid Studio, và được điều khiển một cách tự động thông qua Android Studio.Trong gradle có build.gradle (Project) và build.gradle (Module) được sử dụng để buildcác cấu hình áp dụng cho tất cả các module ứng dụng hoặc dành riêng cho một mô-đun ứng dụng.
Trang 17Hình 2.11 Cấu trúc Gradle Scripts2.3 Cài đặt và chạy demo giải thích chức năng chính
2.3.1 Cài đặt
Cấu hình đề nghị cho thiết bị chạy ứng dụng:Điện thoại di động Android 6.0 MarshmallowRam 1GB
o Ram: 1,5 GBo Bộ nhớ trống: 6 GBThiết bị thật: Vivo Y55
o Phiên bản Android: 6.0o API: 23
o RAM: 2 GBo Bộ nhớ trống: 3 GB2.3.2 Code
Link Github: https://github.com/LeNgan1411/Food_App-master.git
Trang 18Đăng kíKhai báo biến
public classDangKyActivityextendsAppCompatActivityimplementsView OnClickListener { private EditText edTenDangNhap, edMatKhau, edNgaySinh, edCMND;
private Button btnDongY, btnThoat; private TextView txtTieuDeDangKy; private RadioGroup rgGioiTinh; private RadioButton rdNam, rdNu; private Spinner spinQuyen; private String sGioiTinh; private NhanVienDAO nhanVienDAO; private QuyenDAO quyenDAO; private int manhanvien = 0; private List<QuyenDTO> quyenDTOList; private List<String> dataAdapter;
Khởi tạo đối tượng và phương thức
protected voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_dangky);
edTenDangNhap = findViewById(R.id.edTenDangNhapDK); edMatKhau = findViewById(R.id.edMatKhauDK); edNgaySinh = findViewById(R.id.edNgaySinhDK); edCMND = findViewById(R.id.edCMNDDK); rdNam = findViewById(R.id.rdNam); rdNu = findViewById(R.id.rdNu);
txtTieuDeDangKy = findViewById(R.id.txtTieuDeDangKy); btnDongY = findViewById(R.id.btnDongYDK); btnThoat = findViewById(R.id.btnThoatDK); spinQuyen = findViewById(R.id.spinQuyen); rgGioiTinh = findViewById(R.id.rgGioiTinhDK); btnDongY.setOnClickListener(this); btnThoat.setOnClickListener(this); edNgaySinh.setOnClickListener(this); nhanVienDAO = newNhanVienDAO this( ); quyenDAO = new QuyenDAO this( ); quyenDTOList = quyenDAO LayDanhSachQuyen (); dataAdapter = newArrayList<>();
for int ( i = 0; i < quyenDTOList.size(); i ++){ String tenquyen = quyenDTOList.get(i).getTenQuyen(); dataAdapter.add(tenquyen);
}
manhanvien = getIntent().getIntExtra("manhanvien", 0);
Đổ dữ liệu lên Spiner
ArrayAdapter<String> adapter = new ArrayAdapter<> this android R( , layout.simple_list_item_1, dataAdapter); spinQuyen.setAdapter(adapter);
adapter.notifyDataSetChanged(); (manhanvien != 0){if
txtTieuDeDangKy.setText(getResources().getString(R.string.capnhatnhanvien)); NhanVienDTO nhanVienDTO = nhanVienDAO LayDanhSachNhanVienTheoMa (manhanvien);
Trang 19edCMND.setText(String.valueOf(nhanVienDTO.getCMND())); edNgaySinh.setText(nhanVienDTO.getNGAYSINH()); String gioitinh = nhanVienDTO.getGIOITINH(); (gioitinh.equals(if "Nam")) rdNam.setChecked(true); else rdNu.setChecked(true);
}
Đồng ý thêm nhân viên
private voidDongYThemNhanVien(){
String sTenDangNhap = edTenDangNhap.getText().toString(); String sMatKhau = edMatKhau.getText().toString(); switch (rgGioiTinh.getCheckedRadioButtonId()){ caseR.id.rdNam:
sGioiTinh="Nam"; break; caseR.id.rdNu:
sGioiTinh="Nữ"; break; }
String sNgaySinh = edNgaySinh.getText().toString(); String sCMND = edCMND.getText().toString(); (sTenDangNhap == if null || sTenDangNhap.equals("")){
Toast.makeText(DangKyActivity this , getResources().getString( string.loitendangnhap), RToast.LENGTH_SHORT).show();
}
elseif (sMatKhau == null || sMatKhau.equals("")){
Toast.makeText(DangKyActivity this , getResources().getString( string.loinhapmatkhau), RToast.LENGTH_SHORT).show();
} else {
NhanVienDTO nhanVienDTO = new NhanVienDTO(); nhanVienDTO.setTENDANGNHAP(sTenDangNhap); nhanVienDTO.setMATKHAU(sMatKhau); nhanVienDTO.setCMND(sCMND); nhanVienDTO.setNGAYSINH(sNgaySinh); nhanVienDTO.setGIOITINH(sGioiTinh); int maquyen = 1;
(spinQuyen.getSelectedItem().toString().equalsIgnoreCase(if "Quản lý")){ maquyen = 0;
}
nhanVienDTO.setMAQUYEN(maquyen);
boolean kiemtra = nhanVienDAO ThemNV (nhanVienDTO);
(kiemtra) if Toast.makeText(DangKyActivity this , getResources().getString( string.themthanhcong), RToast.LENGTH_SHORT).show();
elseToast.makeText(DangKyActivity this , getResources().getString( string.themthatbai), RToast.LENGTH_SHORT).show();
} }
Sửa nhân viên
String sTenDangNhap = edTenDangNhap.getText().toString(); String sMatKhau = edMatKhau.getText().toString(); String sNgaySinh = edNgaySinh.getText().toString(); String sCMND = edCMND.getText().toString(); switch (rgGioiTinh.getCheckedRadioButtonId()) { caseR.id.rdNam:
sGioiTinh = "Nam"; break; caseR.id.rdNu:
sGioiTinh = "Nữ"; break; }
(sTenDangNhap == if null || sTenDangNhap.equals("")){
Toast.makeText(DangKyActivity this , getResources().getString( string.loitendangnhap), RToast.LENGTH_SHORT).show();
}
elseif (sMatKhau == null || sMatKhau.equals("")){
Trang 20} else {
NhanVienDTO nhanVienDTO = new NhanVienDTO(); nhanVienDTO.setMANV(manhanvien); nhanVienDTO.setTENDANGNHAP(sTenDangNhap); nhanVienDTO.setMATKHAU(sMatKhau); nhanVienDTO.setCMND(sCMND); nhanVienDTO.setNGAYSINH(sNgaySinh); nhanVienDTO.setGIOITINH(sGioiTinh); int vitri = spinQuyen.getSelectedItemPosition(); int maquyen = quyenDTOList.get(vitri).getMaQuyen(); nhanVienDTO.setMAQUYEN(maquyen);
boolean kiemtra = nhanVienDAO SuaNV (nhanVienDTO); (kiemtra)if
Toast.makeText(DangKyActivity this , getResources().getString( string.suathanhcong), RToast.LENGTH_SHORT).show();
(manhanvien != 0)if
//Thực hiện code sửa nhân viên
SuaNhanVien(); else
//Thực hiện thêm mới nhân viên
DongYThemNhanVien(); break;
caseR.id.btnThoatDK:
finish(); break;
caseR.id.edNgaySinhDK:
ChooseDay(); break; } }
Chọn ngày
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); try {
(!edNgaySinh.getText().toString().equals(if "")) cal.setTime(sdf.parse(edNgaySinh.getText().toString())); else
cal.getTime();
int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog this android R style Theme_Holo_Light_Dialog( , , (datePicker, yearSelected, monthSelected, daySelected) -> {
monthSelected = monthSelected + 1;
Date date = StringToDate(daySelected + + monthSelected + + yearSelected, "/" "/" "dd/MM/yyyy"); edNgaySinh.setText(new SimpleDateFormat("dd/MM/yyyy").format(date));
}, year, month, day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable Color( TRANSPARENT)); dialog.setTitle("Chọn ngày sinh");
dialog.show(); } catch ParseException ( e) {
Toast.makeText(this, "Lỗi: " + e.getMessage(), Toast.LENGTH_SHORT).show(); }