1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

40 8 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Xây dựng app đặt món ăn tại nhà hàng
Tác giả Quách Thị Dung, Nguyễn Hoàng Hà, Lê Thị Ngân
Người hướng dẫn PGS. TS Vũ Song Tùng
Trường học Trường Đại học Bách khoa Hà Nội
Chuyên ngành Lập trình di động
Thể loại Báo cáo cuối kỳ
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 40
Dung lượng 3,84 MB

Cấu trúc

  • CHƯƠNG 1. TỔNG QUAN VỀ ĐỀ TÀI (6)
    • 1.1 Giới thiệu về đề tài (6)
    • 1.2 Các tính năng của chương trình (6)
    • 1.3 Tính hữu dụng của phần mềm (7)
    • 1.4 Công cụ lập trình Android Studio (7)
    • 1.5 Kết luận chương (7)
  • CHƯƠNG 2. THIẾT KẾ HỆ THỐNG (7)
    • 2.1 Thiết kế cơ sở dữ liệu (8)
      • 2.1.1 Sơ đồ khối chức năng (8)
      • 2.1.2 Các thực thể trong cơ sở dữ liệu (9)
      • 2.1.3 Thiết kế dữ liệu (10)
      • 2.1.4 Sơ đồ thực thể liên kết (13)
    • 2.2 Cấu trúc Android Project (13)
      • 2.2.1 Thư mục java (13)
      • 2.2.2 Thư mục res (0)
      • 2.2.3 Thư mục manifests (16)
      • 2.2.4 Gradle Scripts (16)
    • 2.3 Cài đặt và chạy demo giải thích chức năng chính (17)
      • 2.3.1 Cài đặt (17)
      • 2.3.2 Code (17)
    • 2.4 Kết luận chương (29)
  • CHƯƠNG 3. KẾT QUẢ THỰC NGHIỆM (29)
    • 3.1 Kết quả (29)
    • 3.2 Kết luận (39)
      • 3.2.1 Các chức năng chính của ứng dụng đã thực hiện (39)
      • 3.2.2 Ưu điểm (39)
      • 3.2.3 Nhược điểm (39)
      • 3.2.4 Kết luận chung (39)
  • TÀI LIỆU THAM KHẢO (40)

Nội dung

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

TỔNG QUAN VỀ ĐỀ TÀI

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 trong khâ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 đầu

Yêu cầu chức năng: o User có quyền có thể thay đổi thông tin món ăn o 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 ăn o 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ọn món o Có thể chọn món và huỷ món

Yêu cầu phi chức năng: o Sử dụng phần mềm Android Studio o Hệ thống có tính bảo mật và phân quyền o Giao diện dễ sử dụng, không bị nhầm lẫn o Ứng dụng được dùng trên điện thoại hoặc tablet

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ập thông tin vào ứng dụng Thông tin sẽ được gửi đến máy quản lí và thực hiện theo 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ẽ được gử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 cho khách hàng.

Tính hữu dụng của phần mềm

Giúp admin có thể quản lý được nhân viên, trạng thái các bàn, thức ăn/ đồ uống v.v

Cập nhật, thêm, xóa thông tin

Quản lý được các dịch vụ của cửa hàng

Tránh sai sót khi gọi món ăn

Công cụ lập trình Android Studio

Test Modules: Những modules này chứa mã để kiểm tra ứng dụng và xây dựng bên trong ứng dụng kiểm tra mà nó chạy trên thiết bị Mặc định, Android studio tạ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ự án Android Đ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úng trong 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ộc tí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ười dù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ác thời gian thực.

Android Application Modules: Các modules của ứng dụng Android được bao gồm trong tệp tin apk tệp tin cơ sở trên việc cài đặt hệ thống build Chúng chứ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.

Kết luận chương

Chương 1 đã giới thiệu được tổng quan về đề tài, là cơ sở để xây dựng và thiết kế hệ thống

THIẾT KẾ HỆ THỐNG

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 Đăng nhập Đăng nhập, đăng ký nhân viên có phân quyền: Khi khởi động ứng dụng nếu ban đầu, ta sẽ đăng nhập vào app bằng tên đăng nhập và mật khẩu mặc định đều là admin Trong quá trình sử dụng, ta có thể thay đổi tên đăng nhập và mật khẩu mặc định.

Trong hiển thị danh sách nhân viên khi nhấn giữ nhân viên nào đó sẽ xuất hiện lên option menu có lựa chọn sửa và xóa.

Nếu nhấn vào sửa thì sẽ hiện lên màn hình cho phép sửa các thông tin của nhân viên đó.

Nếu nhấn vào xóa thì sẽ xóa nhân viên đó.

Khi hiển thị danh sách nhân viên, nút "Thêm nhân viên" (đăng ký) cho phép người dùng tạo một nhân viên mới bằng cách mở màn hình nhập dữ liệu nhân viê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.

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ên một popup để nhập tên bàn ăn mới.

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ược lạ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ên o Tên đăng nhập o Mật khẩu o Giới tính o Ngày sinh o Chứng minh nhân dân o 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 ăn o 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 ăn o Mã loại món ăn o Giá tiền o Hình ảnh

Thự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àn o Mã nhân viên o Ngày gọi món o 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 ăn o Số lượng

Hệ 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

STT THUỘC TÍNH KIỂU DỮ

1 MANV int Mã nhân viên, trường khóa tự động tăng

2 TENDN text Tên đăng nhập đồng thời là tên nhân viên

5 NGAYSINH text Ngày, tháng, năm sinh

6 CMND text Chứng minh nhân dân

7 MAQUYEN int Mã quyền o Bảng BANAN (Bàn ăn): lưu thông tin bàn

Bảng 2.2 Bảng thông tin bàn

STT THUỘC TÍNH KIỂU DỮ

1 MABAN int Mã bàn, trường khóa tự động tăng

3 TINHTRANG text Tình trạng 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

STT THUỘC TÍNH KIỂU DỮ

1 MAMON int Mã món, trường khóa tự động tăng

2 TENMONAN text Tên món ăn

4 MALOAI int Mã loại món ăn

5 HINHANH text Hình ảnh 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

TBLLOAIMON STT THUỘC TÍNH KIỂU DỮ

1 MALOAI int Mã loại món ăn, trường khóa tự động tăng

2 TENLOAI text Tên loại món ăn o Bảng QUYỀN (Quyền): lưu thông tin quyền

Bảng 2.5 Bảng thông tin quyền

STT THUỘC TÍNH KIỂU DỮ

1 MAQUYEN int Mã quyền, trường khóa tự động tăng

2 TENQUYEN text Tên 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

STT THUỘC TÍNH KIỂU DỮ

1 MAGOIMON int Mã gọi món, trường khóa tự động tăng

3 MANV int Mã nhân viên

5 TINHTRANG text Tình trạng gọi món o Bảng CHITIETGOIMON (Chi tiết gọi món): lưu thông tin chi tiết gọi món

Bảng 2.7 Bảng chi tiết gọi món

STT THUỘC TÍNH KIỂU DỮ

1 MAGOIMON int Mã gọi món

2 MAMONAN int Mã món ăn

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

Cấu trúc Android Project

Thư mục `java` lưu trữ mã nguồn Java (.java) cho ứng dụng Đối với ứng dụng này, thư mục `java` bao gồm lớp DTO, DAO, database và các hoạt động (activity) trong ứng dụng.

Hình 2.6 Cấu trúc thư mục layout

Thư mục này sẽ chứa một số file XML khác nhau, chẳng hạn như strings, colors,styles.

Hình 2.7 Cấu trúc thư mục values

Thư mục chứa các file XML quy định các hiệu ứng chuyển đổi hình ảnh trong ứng dụng.

Hình 2.8 Cấu trúc thư mục anim

Thư mục chứa các file XML thể hiện các menu pop-up trong quá trình sử dụng ứng dụng.

Hình 2.9 Cấu trúc thư mục menu

Thư mục này sẽ chứa một file Manifest (AndroidManifest.xml) cho ứng dụng Android File manifest này sẽ chứa thông tin về ứng dụng (Android version, access permissions, metadata và các component của ứng dụng) File manifest sẽ hoạt động như 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

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 để build cá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.

Cài đặt và chạy demo giải thích chức năng chính

Cấu hình đề nghị cho thiết bị chạy ứng dụng: Điện thoại di động Android 6.0 Marshmallow

Bộ nhớ trống khoảng 20mb

Khi cài đặt ứng dụng phải cấp quyền truy cập bộ nhớ Cấu hình các thiết bị được nhóm test:

Máy ảo: Pixel 5 o Phiên bản Android: 11.0 o API: 30 o Ram: 1,5 GB o Bộ nhớ trống: 6 GB

Thiết bị thật: Vivo Y55 o Phiên bản Android: 6.0 o API: 23 o RAM: 2 GB o Bộ nhớ trống: 3 GB

Link Github: https://github.com/LeNgan1411/Food_App-master.git Đăng kí

Khai báo biến public class DangKyActivity extends AppCompatActivity implements View 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 quyenDTOList; private List dataAdapter;

Khởi tạo đối tượng và phương thức protected void onCreate(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 = new NhanVienDAO this( ); quyenDAO = new QuyenDAO this( ); quyenDTOList = quyenDAO LayDanhSachQuyen (); dataAdapter = new ArrayList(); 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 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); edTenDangNhap.setText(nhanVienDTO.getTENDANGNHAP()); edMatKhau.setText(nhanVienDTO.getMATKHAU()); edCMND.setText(String.valueOf(nhanVienDTO.getCMND())); edNgaySinh.setText(nhanVienDTO.getNGAYSINH());

(gioitinh.equals(if "Nam")) rdNam.setChecked(true); else rdNu.setChecked(true);

} Đồng ý thêm nhân viên private void DongYThemNhanVien(){

String sTenDangNhap = edTenDangNhap.getText().toString();

String sMatKhau = edMatKhau.getText().toString(); switch (rgGioiTinh.getCheckedRadioButtonId()){ case R.id.rdNam: sGioiTinh="Nam"; break; case R.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), R Toast.LENGTH_SHORT).show();

} else if (sMatKhau == null || sMatKhau.equals("")){

Toast.makeText(DangKyActivity this , getResources().getString( string.loinhapmatkhau), R Toast.LENGTH_SHORT).show();

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), R Toast.LENGTH_SHORT).show(); else Toast.makeText(DangKyActivity this , getResources().getString( string.themthatbai), R Toast.LENGTH_SHORT).show();

String sTenDangNhap = edTenDangNhap.getText().toString();

String sMatKhau = edMatKhau.getText().toString();

String sNgaySinh = edNgaySinh.getText().toString();

String sCMND = edCMND.getText().toString(); switch (rgGioiTinh.getCheckedRadioButtonId()) { case R.id.rdNam: sGioiTinh = "Nam"; break; case R.id.rdNu: sGioiTinh = "Nữ"; break;

(sTenDangNhap == if null || sTenDangNhap.equals("")){

Toast.makeText(DangKyActivity this , getResources().getString( string.loitendangnhap), R Toast.LENGTH_SHORT).show();

} else if (sMatKhau == null || sMatKhau.equals("")){

Toast.makeText(DangKyActivity this , getResources().getString( string.loinhapmatkhau), R

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);

Toast.makeText(DangKyActivity this , getResources().getString( string.suathanhcong), R

Toast.LENGTH_SHORT).show(); else

Toast.makeText(DangKyActivity this , getResources().getString( string.loi), R Toast.LENGTH_SHORT).show(); }

Gọi hàm public void onClick(View v) { int id = v.getId(); switch (id){ case R.id.btnDongYDK:

//Thực hiện code sửa nhân viên

//Thực hiện thêm mới nhân viên

DongYThemNhanVien(); break; case R.id.btnThoatDK: finish(); break; case R.id.edNgaySinhDK:

Chọn ngày public void ChooseDay(){

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); try {

The program retrieves the user's birthdate as a string.* If the string is not empty, the program converts it into a date object using the SimpleDateFormat class.* The program then extracts the year, month, and day components from the date object.

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();

Toast.makeText(this, "Lỗi: " + e.getMessage(), Toast.LENGTH_SHORT).show();

@SuppressLint("SimpleDateFormat") public DateStringToDate(String dob, String format){

SimpleDateFormat formatter = new SimpleDateFormat(format); try { return formatter.parse(dob);

Toast.makeText(this, "Lỗi: " + e.getMessage(), Toast.LENGTH_SHORT).show();

Khai báo biến public class DangNhapActivity extends AppCompatActivity implements View OnClickListener { private EditText edTenDangNhap, edMatKhau; private Button btnDongY; private NhanVienDAO nhanVienDAO; private final int STORAGE_PERMISSION_CODE = 1;

Khởi tạo đối tượng và phương thức protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_dangnhap); edTenDangNhap = findViewById(R.id.edTenDangNhapDN); edMatKhau = findViewById(R.id.edMatKhauDN); btnDongY = findViewById(R.id.btnDongYDN); nhanVienDAO = new NhanVienDAO this( );

(if ContextCompat.checkSelfPermission(this, Manifest.permission READ_EXTERNAL_STORAGE ) !PackageManager.PERMISSION_GRANTED) requestStoragePermission(); btnDongY.setOnClickListener(this);

Yêu cầu quyền lưu trữ private void requestStoragePermission() {

(if ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest permission READ_EXTERNAL_STORAGE)) { . new AlertDialog Builder this ( )

setTitle("Ứng dụng cần được cấp quyền")

setMessage("Ứng dụng cần được cấp quyền truy cập bộ nhớ để có thể sử dụng ứng dụng tốt hơn!") setPositiveButton("Ok", (dialog, which) -> ActivityCompat.requestPermissions(this, new String[] {Manifest permission READ_EXTERNAL_STORAGE }, STORAGE_PERMISSION_CODE))

setNegativeButton("Hủy", (dialog, which) -> System.exit(0))

ActivityCompat.requestPermissions(this, new String[] {Manifest.permission READ_EXTERNAL_STORAGE }, STORAGE_PERMISSION_CODE);

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { (requestCode == STORAGE_PERMISSION_CODE) {if

(grantResults.length > 0 && grantResults[0] == if PackageManager.PERMISSION_GRANTED) {

Toast.makeText(this, "Đã được cấp quyền!", Toast.LENGTH_SHORT).show();

Toast.makeText(this, "Ứng dụng bị từ chối cấp quyền!", Toast.LENGTH_SHORT).show(); requestStoragePermission();

} Đồng ý đăng nhập private void btnDongY(){

String sTenDangNhap = edTenDangNhap.getText().toString();

String sMatKhau = edMatKhau.getText().toString(); int kiemtra = nhanVienDAO KiemTraDangNhap (sTenDangNhap, sMatKhau); int maquyen = nhanVienDAO LayQuyenNhanVien (kiemtra);

SharedPreferences sharedPreferences = getSharedPreferences("luuquyen", Context.MODE_PRIVATE); // chỉ có ứng dụng này đc dùng

SharedPreferences Editor editor = sharedPreferences.edit(); editor.putInt("maquyen", maquyen); editor.apply();

Intent iTrangChu = new Intent DangNhapActivity this( , TrangChuActivity.class); // chuyển đổi 2 activity iTrangChu.putExtra("tendn", edTenDangNhap.getText().toString()); iTrangChu.putExtra("manhanvien", kiemtra); startActivity(iTrangChu); finish(); overridePendingTransition( anim.hieuung_activity_vao, R R.anim.hieuung_activity_ra);

} else Toast.makeText(DangNhapActivity.this, "Đăng nhập thất bại!!", Toast.LENGTH_SHORT).show();

@Override public void onClick(View view) { int id = view.getId();

(id == id.btnDongYDN) btnDongY();if R

Khai báo biến public class SoLuongActivity extends AppCompatActivity implements View OnClickListener { int maban, mamonan;

Khởi tạo đối tượng protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_themsoluong); btnDongYThemSoLuong = findViewById(R.id.btnDongYThemSoLuong); edSoLuong = findViewById(R.id.edSoLuongMonAn); goiMonDAO = new GoiMonDAO this( );

Intent intent = getIntent(); maban = intent.getIntExtra("maban", 0); mamonan = intent.getIntExtra("mamonan", 0); btnDongYThemSoLuong.setOnClickListener(this);

Cập nhật món đã tồn tại và thêm món ăn public void onClick(View v) { int magoimon = (int goiMonDAO LayMaGoiMonTheoMaBan) (maban, "false"); boolean kiemtra = goiMonDAO KiemTraMonAnDaTonTai (magoimon, mamonan);

//tiến hành cập nhật món đã tồn tại int soluongcu = goiMonDAO LaySoLuongMonAnTheoMaGoiMon (magoimon, mamonan); int soluongmoi = Integer.parseInt(edSoLuong.getText().toString()); int tongsoluong = soluongcu + soluongmoi;

ChiTietGoiMonDTO chiTietGoiMonDTO = new ChiTietGoiMonDTO(); chiTietGoiMonDTO.setMaGoiMon(magoimon); chiTietGoiMonDTO.setMaMonAn(mamonan); chiTietGoiMonDTO.setSoLuong(tongsoluong); boolean kiemtracapnhat = goiMonDAO CapNhatSoLuong (chiTietGoiMonDTO);

Toast.makeText(this, getResources().getString( string.themthanhcong), R Toast.LENGTH_SHORT).show(); else

Toast.makeText(this, getResources().getString( string.themthatbai), R Toast.LENGTH_SHORT).show(); }else {

//thêm món ăn int soluonggoi = Integer.parseInt(edSoLuong.getText().toString());

ChiTietGoiMonDTO chiTietGoiMonDTO = new ChiTietGoiMonDTO(); chiTietGoiMonDTO.setMaGoiMon(magoimon); chiTietGoiMonDTO.setMaMonAn(mamonan); chiTietGoiMonDTO.setSoLuong(soluonggoi); boolean kiemtrathem = goiMonDAO ThemChiTietGoiMon (chiTietGoiMonDTO);

Toast.makeText(this, getResources().getString( string.themthanhcong), R Toast.LENGTH_SHORT).show(); else

Toast.makeText(this, getResources().getString( string.themthatbai), R Toast.LENGTH_SHORT).show(); } finish();

Sửa bàn ăn public class SuaBanAnActivity extends AppCompatActivity implements View OnClickListener { private Button btnDongYSua; private EditText edSuaTenBan; private BanAnDAO banAnDAO; int maban;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_suabanan); btnDongYSua = findViewById(R.id.btnDongYSuaBanAn); edSuaTenBan = findViewById(R.id.edSuaTenBanAn); banAnDAO = new BanAnDAO(this); maban = getIntent().getIntExtra("maban", 0); btnDongYSua.setOnClickListener(this);

@Override public void onClick(View v) {

String tenban = edSuaTenBan.getText().toString();

(tenban.trim().equals( ) || tenban.trim() != if "" null){ boolean kiemtra = banAnDAO CapNhatTenBan (maban, tenban);

Intent intent = new Intent(); intent.putExtra("kiemtra", kiemtra); setResult(Activity.RESULT_OK, intent); finish();

Toast.makeText(SuaBanAnActivity.this, getResources().getString( string.vuilongnhapdulieu), RToast.LENGTH_SHORT).show();

Khởi tạo đối tượng và phương thức protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_thanhtoan); gridView = findViewById(R.id.gvThanhToan); btnThanhToan = findViewById(R.id.btnThanhToan); btnThoat = findViewById(R.id.btnThoatThanhToan); txtTongTien = findViewById(R.id.txtTongTien); goiMonDAO = new GoiMonDAO this( ); banAnDAO = new BanAnDAO(this); fragmentManager = getSupportFragmentManager(); maban = getIntent().getIntExtra("maban", 0);

HienThiThanhToan(); for int ( i = 0; i < thanhToanDTOList.size(); i++){ int soluong = thanhToanDTOList.get(i).getSoLuong(); int giatien = thanhToanDTOList.get(i).getGiatien(); tongtien += (soluong * giatien);

} txtTongTien.setText(getResources().getString( string.tongcong) + + tongtien);R " "

} btnThanhToan.setOnClickListener(this); btnThoat.setOnClickListener(this);

Hiển thị thanh toán private void HienThiThanhToan(){ int magoimon = (int goiMonDAO LayMaGoiMonTheoMaBan) (maban, "false"); thanhToanDTOList = goiMonDAO LayDanhSachMonAnTheoMaGoiMon (magoimon); adapterHienThiThanhToan = new AdapterHienThiThanhToan this R( , layout.custom_layout_hienthithanhtoan, thanhToanDTOList); gridView.setAdapter(adapterHienThiThanhToan); adapterHienThiThanhToan.notifyDataSetChanged();

@Override public void onClick(View v) { int id = v.getId(); switch (id){ case R.id.btnThanhToan: boolean kiemrabanan = banAnDAO CapNhatTinhTrangBan (maban, "false"); boolean kiemtragoimom = goiMonDAO CapNhatTrangThaiGoiMonTheoMaBan (maban, "true");

Toast.makeText(ThanhToanActivity this , getResources().getString( string.thanhtoanthanhcong), R Toast.LENGTH_SHORT);

Toast.makeText(ThanhToanActivity this , getResources().getString( string.loi), R Toast.LENGTH_SHORT); break; case R.id.btnThoatThanhToan: finish(); break;

Thêm bàn ăn public class ThemBanAnActivity extends AppCompatActivity implements View OnClickListener { private EditText edTenThemBanAn; private Button btnDongYThemBanAn; private BanAnDAO banAnDAO;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_thembanan); edTenThemBanAn = findViewById(R.id.edTenThemBanAn); btnDongYThemBanAn = findViewById(R.id.btnDongYThemBanAn); banAnDAO = new BanAnDAO(this); btnDongYThemBanAn.setOnClickListener(this);

@Override public void onClick(View view) {

String sTenBanAn = edTenThemBanAn.getText().toString();

(sTenBanAn != if null || sTenBanAn.equals("")){ boolean kiemtra = banAnDAO ThemBanAn (sTenBanAn);

Intent intent = new Intent(); intent.putExtra("ketquathem", kiemtra); setResult(Activity.RESULT_OK, intent); finish();

Thêm loại thực đơn public class ThemLoaiThucDonActivity extends AppCompatActivity implements View OnClickListener { private Button btnDongYThemLoaiThucDon; private EditText edTenLoai; private LoaiMonAnDAO loaiMonAnDAO;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_themloaithucdon); loaiMonAnDAO = new LoaiMonAnDAO this( ); btnDongYThemLoaiThucDon = findViewById(R.id.btnDongYThemLoaiThucDon); edTenLoai = findViewById(R.id.edThemLoaiThucDon); btnDongYThemLoaiThucDon.setOnClickListener(this);

@Override public void onClick(View v) {

String sTenLoaiThucDon = edTenLoai.getText().toString();

(sTenLoaiThucDon != if null || sTenLoaiThucDon.equals("")){ boolean kiemtra = loaiMonAnDAO ThemLoaiMonAn (sTenLoaiThucDon);

Intent iDuLieu = new Intent(); iDuLieu.putExtra("kiemtraloaithucdon", kiemtra); setResult(Activity.RESULT_OK, iDuLieu); finish();

Toast.makeText(this, getResources().getString( string.vuilongnhapdulieu), R Toast.LENGTH_SHORT).show(); }

Thêm thực đơn public class ThemThucDonActivity extends AppCompatActivity implements View OnClickListener { public static int REQUEST_CODE_THEMLOAITHUCDON = 113; public static int REQUEST_CODE_MOHINH = 123; private ImageButton imThemLoaiThucDon; private Spinner spinLoaiThucDon; private LoaiMonAnDAO loaiMonAnDAO; private MonAnDAO monAnDAO; private List loaiMonAnDTOs; private AdapterHienThiLoaiMonAn adapterHienThiLoaiMonAn; private ImageView imHinhThucDon; private Button btnDongYThemMonAn, btnThoatThemMonAn; private String sDuongdanhinh; private EditText edTenMonAn, edGiaTien;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_themthucdon); loaiMonAnDAO = new LoaiMonAnDAO this( ); monAnDAO = new MonAnDAO this( ); imThemLoaiThucDon = findViewById(R.id.imThemLoaiThucDon); spinLoaiThucDon = findViewById(R.id.spinLoaiMonAn); imHinhThucDon = findViewById(R.id.imHinhThucDon); btnDongYThemMonAn = findViewById(R.id.btnDongYThemMonAn); btnThoatThemMonAn = findViewById(R.id.btnThoatThemMonAn); edTenMonAn = findViewById(R.id.edThemTenMonAn); edGiaTien = findViewById(R.id.edThemGiaTien);

//bắt sự kiện click imThemLoaiThucDon.setOnClickListener(this); imHinhThucDon.setOnClickListener(this); btnDongYThemMonAn.setOnClickListener(this); btnThoatThemMonAn.setOnClickListener(this);

Hiển thị Spiner loại món ăn private void HienThiSpinnerLoaiMonAn(){ loaiMonAnDTOs = loaiMonAnDAO LayDanhSachLoaiMonAn (); adapterHienThiLoaiMonAn = new AdapterHienThiLoaiMonAn ThemThucDonActivity this( ,

R.layout.custom_layout_spinloaithucdon, loaiMonAnDTOs); spinLoaiThucDon.setAdapter(adapterHienThiLoaiMonAn); adapterHienThiLoaiMonAn.notifyDataSetChanged();

@Override public void onClick(View v) { int id = v.getId(); switch (id){ case R.id.imThemLoaiThucDon:

Intent iThemLoaiMonAn = new Intent(ThemThucDonActivity this ThemLoaiThucDonActivity , class); startActivityForResult(iThemLoaiMonAn, REQUEST_CODE_THEMLOAITHUCDON); break; case R.id.imHinhThucDon:

Intent iMoHinh = new Intent(); iMoHinh.setType("image/*"); iMoHinh.setAction(Intent.ACTION_PICK); startActivityForResult(Intent.createChooser(iMoHinh,"Chọn hình thực đơn"), REQUEST_CODE_MOHINH); break; case R.id.btnDongYThemMonAn: int vitri = spinLoaiThucDon.getSelectedItemPosition(); //trả về vị trí item đã chọn int maloai = loaiMonAnDTOs.get(vitri).getMaLoai();

String tenmonan = edTenMonAn.getText().toString();

String giatien = edGiaTien.getText().toString();

(tenmonan != if null && giatien != null && !tenmonan.equals( ) && !giatien.equals("" "")){ MonAnDTO monAnDTO = new MonAnDTO(); monAnDTO.setGiaTien(giatien); monAnDTO.setHinhAnh(sDuongdanhinh); monAnDTO.setMaLoai(maloai); monAnDTO.setTenMonAn(tenmonan); boolean kiemtra = monAnDAO ThemMonAn (monAnDTO);

Toast.makeText(this, getResources().getString( string.themthanhcong), R Toast.LENGTH_SHORT).show(); else

Toast.makeText(this, getResources().getString( string.themthatbai), R Toast.LENGTH_SHORT).show(); }else

Toast.makeText(this, getResources().getString( string.loithemmonan), R Toast.LENGTH_SHORT).show(); break; case R.id.btnThoatThemMonAn: finish(); break;

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);

(requestCode == REQUEST_CODE_THEMLOAITHUCDON){if

(resultCode == if Activity.RESULT_OK ){

Intent dulieu = data; boolean kiemtra = dulieu.getBooleanExtra("kiemtraloaithucdon", false);

Toast.makeText(this, getResources().getString( string.themthanhcong), R Toast.LENGTH_SHORT).show(); } else

Toast.makeText(this, getResources().getString( string.themthatbai), R Toast.LENGTH_SHORT).show(); }

}else if (REQUEST_CODE_MOHINH == requestCode){

(resultCode == if Activity.RESULT_OK && data != null){ sDuongdanhinh = data.getData().toString(); imHinhThucDon.setImageURI(data.getData());

The homepage public class HomepageActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener contains various components: a DrawerLayout, NavigationView, Toolbar, TextView for displaying employee's name in the navigation, FragmentManager, and constant integer STORAGE_PERMISSION_CODE.

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_trangchu);

(if ContextCompat.checkSelfPermission(this, Manifest.permission READ_EXTERNAL_STORAGE ) !PackageManager.PERMISSION_GRANTED) requestStoragePermission(); drawerLayout = findViewById(R.id.drawerLayout); navigationView = findViewById(R.id.navigationview_trangchu); toolbar = findViewById(R.id.toolbar);

View view = navigationView.inflateHeaderView(R.layout.layout_header_navigation_trangchu); txtTenNhanVien_Navigation = view.findViewById(R.id.txtTenNhanVienNavigation); setSupportActionBar(toolbar); getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);

ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle this( , drawerLayout, toolbar, string.mo, R R.string.dong){

@Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView);

@Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView);

}; drawerLayout.setDrawerListener(drawerToggle); drawerToggle.syncState(); navigationView.setItemIconTintList(null); navigationView.setNavigationItemSelectedListener(this);

String tendn = intent.getStringExtra("tendn");//lưu ý , lấy dữ liệu được gửi từ form dangnhap txtTenNhanVien_Navigation.setText(tendn); fragmentManager = getSupportFragmentManager();

HienThiBanAnFragment hienThiBanAnFragment = new HienThiBanAnFragment(); tranHienThiBanAn.setCustomAnimations( anim.hieuung_activity_vao, R R.anim.hieuung_activity_ra); tranHienThiBanAn.replace( id.content, hienThiBanAnFragment);R tranHienThiBanAn.commit();

(if ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest permission READ_EXTERNAL_STORAGE)) { . new AlertDialog Builder this ( )

setTitle("Ứng dụng cần được cấp quyền")

Kết luận chương

Chương 2 đã trình bày chi tiết về cơ sở dữ liệu, cấu trúc project và phần code các chức năng chính của app Từ mô hình đã thiết kế trong chương này nhóm đạt được kết quả trình bày trong chương tiếp theo

KẾT QUẢ THỰC NGHIỆM

Kết quả

Đăng nhập o Sau khi chạy chương trình lên thì ta có màn hình đăng nhập, người dùng đăng nhập bằng tài khoản và mật khẩu mình đã đăng ký Khi đăng nhập thành công chương trình sẽ hiển thị những tác vụ có thể thực hiện tùy theo quyền mà tài khoản đăng nhập đó có được.

Hình 3.12 Màn hình đăng nhập app o Tên đăng nhập: tên đăng nhập vào hệ thống o Mật khẩu: mật khẩu truy cập o Nút Đồng ý: thực hiện đăng nhập vào hệ thống Đăng ký (thêm nhân viên) o Sau khi đăng nhập lần đầu với tài khoản và mật khẩu mặc định là admin, ta có thể đăng ký thêm nhân viên trong những lần đăng nhập tiếp theo.

Hình 3.13 Màn hình đăng ký nhân viên mới o Trong nagavigation mục nhân viên có context menu thêm nhân viên ở góc trái phía trên màn hình, chọn vào đó sẽ xuất hiện màn hình thêm nhân viên

Màn hình danh sách nhân viên cho phép người quản trị tạo tài khoản cho nhân viên Khi đăng ký tài khoản, quản trị viên cần nhập các thông tin sau: tên đăng nhập (đồng thời là tên nhân viên), mật khẩu, giới tính, quyền hạn, ngày sinh, chứng minh nhân dân Sau khi nhập đầy đủ thông tin, quản trị viên bấm nút Đồng ý để tạo tài khoản hoặc nút Thoát để hủy bỏ quá trình tạo tài khoản.

Sửa và xóa nhân viên o Trong màn hình hiển thị danh sách nhân viên khi nhấn giữ vào nhân viên nào đó sẽ xuất hiện option menu sửa và xóa.

Hình 3.15 Màn hình chức năng sửa xóa nhân viên o Nếu ta chọn sửa nhân viên thì sẽ hiển thị lại một màn hình tương tự như màn hình đăng ký, nhưng ở đây do lấy được mã nhân viên để sửa nên phần mềm sẽ load dữ liệu từ mã nhân viên đó và người dùng sẽ sửa dữ liệu tùy vào mục mà người dùng muốn sửa, sau đó nhấn nút Đồng ý để lưu xuống cơ sở dữ liệu.

Hình 3.16 Màn hình sửa thông tin nhân viên o Nếu chọn xóa thì phần mềm lấy mã nhân viên đó để xóa

Hiển thị bàn ăn o Khi nhấn mục Trang chủ (tức là trang quản lý bàn ăn) thì phần mềm sẽ truy cập đến cơ sở dữ liệu và lấy tất cả danh sách bàn ăn và vẽ lên màn hình

Để hiển thị danh sách bàn ăn, cần tạo danh sách tất cả các bàn ăn, sau đó sử dụng Custom Adapter để tùy chỉnh hiển thị Tiếp theo, đưa Adapter này vào GridView và hiển thị trên màn hình Các bàn ăn đã có khách sẽ được đánh dấu bằng màu sáng, còn bàn trống sẽ hiển thị màu xám để dễ nhận biết.

Hiển thị danh sách thực đơn (Loại món ăn), hiển thị danh sách món ăn, nhân viên o Tương tự như cách hiển thị của mục hiển thị bàn ăn

Hình 3.18 Màn hình hiển thị thực đơn

Hình 3.19 Màn hình danh sách món ăn

Thêm món ăn, loại món ăn o Trong màn hình hiển thị thực đơn có context menu thêm món ăn Có một nút hình dấu cộng màu xanh đó là nút thêm loại thực đơn Khi nhấn vào sẽ hiện lên một popup thêm loại thực đơn cho phép nhập vào tên loại thực đơn Sau đó nhấn nút Đồng ý thì phần mềm sẽ thêm loại thực đơn này vào cơ sở dữ liệu.

Popup thêm loại thực đơn o Nếu muốn thêm món ăn thì người dùng sẽ nhập đầy đủ thông tin cần thiết của món ăn như tên món, giá, loại món ăn và hình ảnh của món ăn đó Nếu người dùng không chọn hình thì phần mềm sẽ để hình mặc định. o Nhấn nút Đồng ý để thêm món ăn vào cơ sở dữ liệu o Nhấn nút Thoát để thoát khỏi màn hình thêm món ăn

Thêm, sửa, xóa bàn ăn o Trong màn hình hiển thị bàn ăn có context menu thêm bàn ăn Khi nhấn vào sẽ hiện lên một popup thêm bàn ăn cho phép nhập vào tên bàn ăn Sau đó nhấn nút Đồng ý thì phần mềm sẽ thêm bàn ăn này vào cơ sở dữ liệu.

Hình 3.20 Popup thêm bàn ăn o Trong màn hình hiển thị danh sách bàn ăn khi nhấn giữ vào bàn ăn nào đó sẽ xuất hiện option menu sửa. o Nếu ta chọn sửa bàn ăn thì sẽ hiển thị một popup sửa bàn ăn cho phép nhập vào tên bàn đó để sửa, nhấn Đồng ý để lưu vào cơ sở dữ liệu

Hình 3.21 Popup sửa bàn ăn

Kết luận

3.2.1 Các chức năng chính của ứng dụng đã thực hiện Ứng dụng sau quá trình xây dựng có những chức năng:

Quản lý nhân viên: cho phép thêm, xóa, sửa nhân viên, hiển thị thông tin nhân viên.

Quản lý hóa đơn : tính toán giá tiền ứng với order và cho phép nhân viên thanh toán.

Quản lý bàn ăn: cho phép quản lý số lượng bàn ăn, tình trạng hiện tại của bàn ăn.

Quản lý thực đơn: cho phép thêm món ăn ứng với mỗi loại thực đơn.

Thống kê hóa đơn trong một khoảng thời gian.

3.2.2 Ưu điểm Đáp ứng hầu như đầy đủ các tính năng ban đầu đặt ra Ứng dụng chạy không yêu cầu quá nhiều tài nguyên máy

3.2.3 Nhược điểm Ứng dụng chưa có một số tính năng nâng cao Đôi khi trong quá trình sử dụng còn gặp một số lỗi nhỏ

Dữ liệu của ứng dụng chỉ được lưu trong máy, chưa có backup

Sau khi thực hiện đề tài, nhóm đã tạo được cơ sở dữ liệu tương đối mô tả các đối tượng cần được quản lý nhà hàng là thông qua mô hình dữ liệu quan hệ và tạo được ứng dụng đơn giản với giao diện trực quan để thao tác với cơ sở dữ liệu Tuy nhiên, sản phẩm còn nhiều hạn chế bởi kinh nghiệm còn hạn hẹp

Qua đề tài này nhóm cũng được trải nghiệm quá trình phát triển phần mềm từ công đoạn thiết kế cho đến bắt tay vào xây dựng ứng dụng và gỡ lỗi, quan trong nhất là tìm hiểu được cách thức thiết kế cơ sở dữ liệu và tối ưu để dễ dàng truy vấn cũng như lưu trữ mắc dù sản phẩm thực tế chưa thực sự tốt như mong đợi.

Ngày đăng: 11/06/2024, 17:41

HÌNH ẢNH LIÊN QUAN

Hình  2.1 Sơ đồ khối chức năng Đăng nhập - 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
nh 2.1 Sơ đồ khối chức năng Đăng nhập (Trang 8)
Bảng 2.1 Bảng thông tin nhân viên - 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ảng 2.1 Bảng thông tin nhân viên (Trang 10)
Bảng 2.3 Bảng thông tin món ăn - 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ảng 2.3 Bảng thông tin món ăn (Trang 11)
Bảng 2.2 Bảng thông tin bàn - 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ảng 2.2 Bảng thông tin bàn (Trang 11)
Bảng 2.4 Bảng thông tin loại món ăn - 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ảng 2.4 Bảng thông tin loại món ăn (Trang 11)
Bảng 2.5 Bảng thông tin quyền - 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ảng 2.5 Bảng thông tin quyền (Trang 12)
Bảng 2.6 Bảng thông tin gọi món - 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ảng 2.6 Bảng thông tin gọi món (Trang 12)
Bảng 2.7 Bảng chi tiết gọi món - 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ảng 2.7 Bảng chi tiết gọi món (Trang 12)
Hình  2.2 Sơ đồ thực thể liên kết 2.2 Cấu trúc Android Project - 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
nh 2.2 Sơ đồ thực thể liên kết 2.2 Cấu trúc Android Project (Trang 13)
Hình  2.6 Cấu trúc thư mục layout - 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
nh 2.6 Cấu trúc thư mục layout (Trang 14)
Hình  2.8 Cấu trúc thư mục anim - 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
nh 2.8 Cấu trúc thư mục anim (Trang 15)
Hình  2.7 Cấu trúc thư mục values - 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
nh 2.7 Cấu trúc thư mục values (Trang 15)
Hình  2.9 Cấu trúc thư mục menu - 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
nh 2.9 Cấu trúc thư mục menu (Trang 16)
Hình  2.10 Cấu trúc thư mục manifests - 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
nh 2.10 Cấu trúc thư mục manifests (Trang 16)
Hình  3.12 Màn hình đăng nhập app - 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
nh 3.12 Màn hình đăng nhập app (Trang 30)
Hình  3.13 Màn hình đăng ký nhân viên mới - 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
nh 3.13 Màn hình đăng ký nhân viên mới (Trang 31)
Hình  3.14 Màn hình danh sách nhân viên - 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
nh 3.14 Màn hình danh sách nhân viên (Trang 32)
Hình  3.15 Màn hình chức năng sửa xóa nhân viên - 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
nh 3.15 Màn hình chức năng sửa xóa nhân viên (Trang 33)
Hình  3.16 Màn hình sửa thông tin nhân viên - 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
nh 3.16 Màn hình sửa thông tin nhân viên (Trang 34)
Hình  3.17 Màn hình danh sách bàn ăn - 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
nh 3.17 Màn hình danh sách bàn ăn (Trang 35)
Hình  3.18 Màn hình hiển thị thực đơn - 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
nh 3.18 Màn hình hiển thị thực đơn (Trang 36)
Hình  3.19 Màn hình danh sách món ăn - 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
nh 3.19 Màn hình danh sách món ăn (Trang 36)
Hình  3.20 Popup thêm bàn ăn - 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
nh 3.20 Popup thêm bàn ăn (Trang 37)
Hình  3.21 Popup sửa bàn ăn - 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
nh 3.21 Popup sửa bàn ăn (Trang 38)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w