Tải bản đầy đủ (.pdf) (40 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.29 MB, 40 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI</b>

<b>VIỆN ĐIỆN TỬ - VIỄN THƠNG</b>

BÁO CÁO CUỐI KỲ

<b>LẬP TRÌNH DI ĐỘNGĐề tài:</b>

<b>XÂY DỰNG APP ĐẶT MÓN ĂN TẠI NHÀ HÀNG</b>

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

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>LỜI NÓI ĐẦU</b>

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, qn ă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ínhtốn.

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

MỤC LỤC

<b>DANH MỤC HÌNH VẼ...i</b>

<b>DANH MỤC BẢNG BIỂU...ii</b>

<b>CHƯƠNG 1. TỔNG QUAN VỀ ĐỀ TÀI...1</b>

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

<b>CHƯƠNG 2. THIẾT KẾ HỆ THỐNG...3</b>

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

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

DANH 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

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

DANH 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

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>CHƯƠNG 1. TỔNG QUAN VỀ ĐỀ TÀI</b>

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

<b>1.1 Giới thiệu về đề tài</b>

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 hố đơ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

<b>1.2 Các tính năng của chương trình</b>

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 tố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à hồn thành q trình thanh tốn chokhách hàng.

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>1.4 Cơng cụ lập trình Android Studio</b>

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 tố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.

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<b>2.1 Thiết kế cơ sở dữ liệu</b>

2.1.1 Sơ đồ khối chức năng.

<b>Hình 2.1 Sơ đồ khối chức năng</b>

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.

<b>Món ăn</b>

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>Bàn ăn</b>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Trong 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.

<b>Gọi món, thanh toán</b>

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 tố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 tố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

<b>Thực thể Nhân Viên bao gồm các thuộc tính: </b>

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>Bàn ăn </b>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ể <b>Món ăn </b>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

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Thực thể <b>Loại món </b>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ể <b>Quyền </b>bao gồm các thuộc tính: o Mã quyền

o Tên quyền

Thực thể <b>Gọi món </b>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ể <b>Chi tiết gọi món </b>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 <b>NHANVIEN</b> (Nhân viên): lưu thông tin nhân viên

<b>Bảng 2.1 Bảng thông tin nhân viên</b>

o Bảng <b>BANAN </b>(Bàn ăn): lưu thông tin bàn

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>Bảng 2.2 Bảng thơng tin bàn</b>

o Bảng <b>MONAN </b>(Món ăn): lưu thơng tin món ăn

<b>Bảng 2.3 Bảng thơng tin món ăn</b>

o Bảng <b>LOAIMON </b>(Loại món): lưu thơng tin loại món ăn

<b>Bảng 2.4 Bảng thơng tin loại món ăn</b>

o Bảng <b>QUYỀN </b>(Quyền): lưu thông tin quyền

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>Bảng 2.5 Bảng thông tin quyền</b>

o Bảng <b>GOIMON</b> (Gọi món): lưu thơng tin gọi món

<b>Bảng 2.6 Bảng thơng tin gọi món</b>

o Bảng <b>CHITIETGOIMON </b>(Chi tiết gọi món): lưu thơng tin chi tiết gọimón

<b>Bảng 2.7 Bảng chi tiết gọi món</b>

TBLCHITIETGOIMON

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

2.1.4 Sơ đồ thực thể liên kết

<b>Hình 2.2 Sơ đồ thực thể liên kết2.2 Cấu trúc Android Project</b>

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.

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>Hình 2.6 Cấu trúc thư mục layout</b>

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.

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>Hình 2.7 Cấu trúc thư mục values</b>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<b>Hình 2.9 Cấu trúc thư mục menu</b>

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 .

<b>Hình 2.10 Cấu trúc thư mục manifests</b>

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.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

<b>Hì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</b>

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: class="text_page_counter">Trang 18</span><div class="page_container" data-page="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);

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

edCMND.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("")){

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="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(); }

</div>

×