Giải thích lưu đồ:
Khách hàng bắt đầu vào ứng dụng, nhập số bàn, thiết bị kiểm tra khách nhập số bàn hay chưa, nếu chưa yêu cầu nhập số bàn, nếu rồi thì kiểm tra bàn đã tồn tại chưa, nếu chưa thì tạo bàn mới, nếu số bàn đã tồn tại ứng dụng kiểm tra bàn số bàn có phù hợp với mã máy khơng, nếu đúng thì cho phép vào bàn, nếu sai yêu cầu nhập lại.
Lưu đồ chương trình menu chính khi khách hàng đã đặt bàn
Bắt đầu
Hiển thị giao diện chính
Kiểm tra màn hình có được bấm hay ko? Vào giao diện menu con
Nút đã chon được
chọn ko? Hiển thị danh sách đã chọn
Nút thanh tốn được
chọn khơng? Hiển thị giao diện thanh tốn
Nút reload được chọn khơng? Cập nhật lại giao diện
Kết thúc Đ S S S Đ S Đ Đ
Giải thích lưu đồ:
Ứng dụng kiểm tra các nút trên màn hình có được bấm hay khơng, nếu món được chọn thì vào giao diện chương trình con, nếu nút đã chọn được nhấn thì vào giao diện các món đã chọn, nếu nút thanh tốn được nhấn thì vào giao diện hóa đơn thanh tốn.
Lưu đồ chương trình menu con khi khách hàng chon loại món
BẮT ĐẦU
HIỂN THỊ GIAO DIỆN MENU CON
KIỂM TRA MENU CĨ ĐƯỢC CHỌN HAY KHƠNG?
HIỂN THỊ GIAO DIỆN XÁC NHẬN CHỌN MÓN
GỞI DỮ LIỆU LÊN CSDL
KẾT THÚC
Đ
S
Giải thích lưu đồ:
Khi giao diện chọn móm được mở ra. Kiểm tra xem khách hàng có chọn món hay khơng, nếu có gởi xác nhận cho khách hàng có muốn chọn hay khơng, nếu có gởi mã món lên cơ sở dữ liệu, nếu khơng u cầu khách nhập lại món mới.
Chương 5 Kết Quả Và Nhận Xét
5.1 kết quả
5.1.1 kết quả học hỏi của nhóm sinh viên thực hiện đề tài
Sau khi thực hiện đề tài “ XÂY DỰNG GIẢI PHÁP THỰC ĐƠN THÔNG MINH CHO QUÁN CAFE ” nhóm sinh viên thực hiện đề tài học hỏi được nhiều kiến
thức bổ ích cho việc phát triển một hệ thống IOT, trong quá trình làm và thực hiện để tài khoảng thời gian là 13 tuần thì nhóm đã học được nhiều kiến thức như là:
Có kiến thức, khái niệm về hệ điều hành Android.
Hiểu được về cơ bản các thành phần cốt lõi xây dựng ứng dụng cho hệ điều hành Android.
Biết cách sử dụng phần mềm để xây dựng chương trình ứng dụng cho hệ điều hành Android.
Biết cách xây dựng, thiết kế giao diện, mã nguồn cho ứng dụng chạy trên nền Android
Hiểu được cách thức hoạt động của một web server.
Hiểu và làm được web service để phục vụ cho một ứng dụng trên điện thoại Android và trên máy tính.
Hiểu về cách thức lập trình của ngơn ngữ java.
Biết tạo một cơ sở dữ liệu mysql, thực hiện được các thao thác UPDATE,
INSERT, DELET trong các bảng cơ sở dữ liệu. Biết cách truy vấn cơ sở dữ liệu từ ngơn ngữ lập trình java.
Biết cách sử dụng phần mềm netbeans để thiết kế form giao diện để tương tác với người dùng.
Biết cách sử dụng phần mềm Android studio để lập trình ứng dụng trên điện thoại Android.
Xây dụng được một web service phục vụ cho ứng dụng phần mềm trên điện thoại cũng như trên máy tính.
5.1.2 kết quả thực hiện đề tài
Sau khi đã vạch ra được kế hoạch để phát triển cho đề tài và đến khi kết thúc đề tài thì nhóm đã thực hiện được hơn 90% mà dự định lúc đầu đã đặt ra ở chương một. Kết quả hệ thống hoạt động ổn định, ứng dụng menu thiết kế trên điện thoại đáp ứng được như yêu cầu lúc ban đầu nhóm đã đặt ra đó là giao diện đơn giản thân thiện với người dùng dễ sử dụng có đầy đủ các tính năng mà một menu thực đơn phải có. Cịn về ứng dụng cho người quản lý qn cafe trên máy tính thì hoạt động ổn định giao diện thiết kế thân thiện dễ sử dụng cho người sử dụng. Tuy nhiên trong quá trình hệ thống hoạt động cũng còn một số lỗi chưa khắc phục được là do mọi dữ liệu của ứng dụng đều được gởi và nhận thông qua internet nên đôi lúc đường truyền mạng khơng ổn định dẫn đến tình trạng ứng dụng Android trên điện thoại và ứng dụng trên máy tính bị treo phải thốt ra khỏi ứng dụng rồi mở lại mới hoạt động trở lại bình thường.
5.1.3 kết quả chạy ứng dụng trên máy tính ( PC )
Giao diện Đăng nhập vào hệ thống trên Server (máy tính) như sau:
Giao diện chính khi đăng nhập vào ứng dụng
Hình 5. 2: Giao diện chính khi đăng nhập
Giao diện tab quản lý bàn khi bàn chưa được đặt ( bàn trống ) trên PC.
Giao diện tab quản lý bàn khi bàn có khách đặt
Giao diện tab đặt bàn gọi món cho khách hàng
Hình 5. 5: Tab đặt bàn và gọi món cho khách
Giao diện tab xuất hóa đơn cho khách hàng
Giao diện tab quản lý các món trong thực đơn của qn
Hình 5. 7: Tab quản lý thực đơn của quán cafe
Giao diện tab quản lý nhân viên của ứng dụng
Hình 5. 9: Tab quản lý thơng kê doanh thu hàng ngày
Giao diện tab giới thiệu cho biết thơng tin nhóm thực hiện và GVHD đồ án
Hình 5. 10: Giao diện giới thiệu về đề tài trên ứng dụng 5.1.4 Kết quả chạy ứng dụng trên điện thoại Android 5.1.4 Kết quả chạy ứng dụng trên điện thoại Android
Hình 5. 11: Giao diện đặt bàn trên Android
Giao diện chọn loại món khi đã đặt bàn
Hình 5. 12: Giao diện chọn lại món khi đã đặt bàn
Hình 5. 13: Giao diện gọi món cụ thể từng loại trên Android
Giao diện xuất hóa đơn cho khách hàng trên điện thoại Android
5.2 Nhận xét 5.2.1 Ưu điểm 5.2.1 Ưu điểm
Thiết kế giao diện gọn gàng, đơn giản, mang lại sự tiện dụng cho người sử dụng.
Bộ phần mềm hầu như đã chạy tốt các chức năng mà nhóm sinh viên thực hiện đã đề ra như : kết nối truyền nhận dữ liệu tốt giữa các thiết bị di động chạy Android và máy chủ web server, có thể truy cập ứng dụng trên máy tính quản lý tình trạng hoạt động của quán ở bất kỳ nơi nào không cần thiết phải có ở khu khu vực quán mới có thể sử dụng được ứng dụng.
Có một web server riêng cho ứng dụng đảm bảo tính bảo mật về thông tin dữ liệu, tốc độ sử lý dữ liệu của web server rất nhanh vì vậy đáp ứng được cho người sử dụng một cách nhanh chóng.
Bộ ứng dụng phần mềm có một cơ sở dữ liệu chung vì vậy đảm bảo được tính đồng bộ dữ liệu giữa ứng dụng trên máy tính và ứng dụng trên Android. Cơ sở dữ liệu có bộ nhớ rất lớn vì thế đáp ứng được tất cả các dữ liệu mà người dùng muốn lưu trữ.
Bộ phần mềm đã được chạy thử nghiệm thực tế trên thiết bị thật và cho kết quả tốt, đúng theo yêu cầu đã đặt ra.
5.2.2 Hạn chế
Ứng dụng cịn ít chức năng, bước đầu chỉ cho phép thực khách chọn món với danh sách cố định có trong thực đơn, chưa cho phép thực khách thêm yêu cầu phụ.
Giao diện quản lý còn đơn giản.
Chương 6 Kết luận Và Hướng Phát Triển
6.1 Kết luận
Sau khi nhóm thực hiện đề tài và làm đến thời gian này thì nhìn tổng quan lại hệ thống đã đáp ứng hơn 90% yêu cầu ban đầu mà nhóm đã đặt ra từ lúc ban đầu, các ứng dụng trên máy tính cũng như điện thoại đều hoạt động tốt, mọi thông tin dữ liệu của khách hàng khi chọn món trên ứng dụng menu của điện thoại đều sử lý một cách nhanh chóng đáp ứng được yêu cầu của khách hàng sử dụng. Các ứng dụng trên máy tính và trên điện thoại Android hoạt động khá tốt ít xảy ra tình trạng lỗi. Hệ thống có thể đem sử dụng thực tế bên ngoài cho một quán cafe bất kỳ nào, ứng dụng menu thực đơn thiết kế trên điện thoại Android thiết kế đơn giản dễ sử dụng cho người dùng cịn về ứng dụng trên máy tính được thiết kế cũng khá dễ dàng cho người sử dụng đáp ứng được những chức năng cơ bản để quản lý hoạt động của một quán cafe.
Tuy nhiên trong quá trình hoạt động của hệ thống vẫn cịn một số lỗi nhỏ ngồi ý muốn lý do là do mọi thông tin dữ liệu của hệ thống đều được gởi và nhận từ internet nên đôi lúc đường truyền internet khơng ổn định dẫn tới tình trạng các ứng dụng trên máy tính và điện thoại bị treo phải tắt ứng dụng đi và mở lại mới hoạt động lại bình thường. Thứ hai là khi áp dụng cho một mơ hình qn cafe thật thì các ứng dụng vẫn cịn thiết xót nhiều chứ năng chưa đảm bảo được yêu cầu khắc khe của người sử dụng vì nhóm chỉ chưa có kinh nghiệm khi phát triển một ứng dụng áp dụng cho một hệ thống thực tế bên ngoài.
6.2 Hướng phát triển
Sau khi hoàn thành đề tài, với những khó khăn nhất định về kiến thức chuyên ngành liên quan và giới hạn thời gian nguyên cứu hoàn thành đề tài ngắn, ứng dụng trên Android cịn hạn chế một số tính năng. Để phần mềm hồn thiện tốt hơn, có khả năng ứng dụng cao hơn trong thực tiễn, nhóm sinh viên nhận thấy cần bổ sung hồn thiện thêm cho chương trình Android một số tính năng như:
Cho phép thực khách nhập thêm yêu cầu phụ về món họ sẽ gọi.
Thêm tính năng báo rung của thiết bị di động để thơng báo bộ phận pha chế đã hồn thành xong một thực đơn nào đấy.
Thêm tính năng thơng báo cho nhân viên biết tình trạng món.
Phát triển ứng dụng trên nhiều hệ điều hành khác nhau.
Bổ xung thêm công nghệ RFID để quản lý lịch làm việc của nhân viên và đồng thời quản lý kho nhập xuất nguyên vật liệu của quán.
TÀI LIỆU THAM KHẢO Sách tham khảo:
1. ThS NGUYỄN VĂN HIỆP, giáo trình lập trình ANDROID trong ứng dụng điều khiển, nhà xuất bản ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
2. TRƯƠNG THỊ NGỌC PHƯỢNG, Giáo trình Lập trình Android cơ bản, Xuất bản ĐH quốc gia TP.HCM.
3. Joshua bloch, Effective Java™, Second Edition
4. ĐỖ TẤN LỰC và VŨ HOÀNG DIỄM KHÁNH, đồ án tốt nghiệp 2014 đề tài “
THIẾT KẾ THỰC ĐƠN NHÀ HÀNG THÔNG MINH ”, TP. HỒ CHÍ MINH
08/2014.
Website tham khảo:
https://www.google.com.vn
http://congdongjava.com/
http://vietandroid.com/
PHỤ LỤC
MÃ NGUỒN CHƯƠNG TRÌNH TRÊN PC Code kết nối database trên web server
package DATABASE; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; public class Database {
public static Connection layketnoi(){ Connection con = null;
try { String url = "jdbc:mysql://173.243.120.231/coffeesh_hcmute?useUnicode=true&characterEncoding= UTF-8"; Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection(url,"coffeesh_duchanh","duchanh#15341008"); } catch (ClassNotFoundException ex) {
Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) {
Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex); }
return con; }
}
Code web service tạo các phương thức truy xuất với database trên web server
/*
* To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates
* and open the template in the editor. */ package Webservicecoffeeshop; import DATABASE.Database; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; import java.util.logging.Logger; import javax.jws.WebService; import javax.jws.WebMethod; import javax.jws.WebParam; /**
* @author dinhlai */
@WebService(serviceName = "Webserviceqlcoffeeshop") public class Webserviceqlcoffeeshop {
/**
* This is a sample web service operation */
@WebMethod(operationName = "hello")
public String hello(@WebParam(name = "name") String txt) { return "Hello " + txt + " !";
}
/**
* Web service operation */
@WebMethod(operationName = "Doctatcamenu") public String Doctatcamenu() {
String kq1 =""; String kq2="["; try {
Connection con = Database.layketnoi(); Statement stm = con.createStatement();
while(rs.next()){ kq1+="{"+"\"mamon\"" +":"+ "\""+rs.getString("mamon")+"\""+" , "+"\"tenmon\""+":"+"\""+rs.getString("tenmon")+"\""+" , "+"\"donvitinh\"" +":"+ "\""+rs.getString("DVT")+"\""+" , "+"\"dongia\""+":"+"\""+rs.getString("dongia")+"\""+","+"\"maloai\"" +":"+ "\""+rs.getString("maloai")+"\""+" , "+"\"hinhanh\"" +":"+ "\""+rs.getString("hinhanh")+"\""+"}"+","; }
} catch (SQLException ex) {
Logger.getLogger(Webserviceqlcoffeeshop.class.getName()).log(Level.SEVERE, null, ex); } kq1 = kq1.substring(0, kq1.length() - 1); kq2+=kq1; kq2+="]"; return kq2; } /**
* Web service operation */
@WebMethod(operationName = "Doctatcanhanvien") public String Doctatcanhanvien() {
String kq1 =""; String kq2="[";
Connection con = Database.layketnoi(); Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from nhanvien"); while(rs.next()){ kq1+="{"+"\"manv\"" +":"+ "\""+rs.getString("manv")+"\""+" , "+"\"hoten\""+":"+"\""+rs.getString("hoten")+"\""+" , "+"\"diachi\"" +":"+ "\""+rs.getString("diachi")+"\""+" , "+"\"Sodienthoai\""+":"+"\""+rs.getString("sodienthoai")+"\""+","+"\"Ngayvaolam\"" +":"+ "\""+rs.getString("ngayvaolam")+"\""+" , "+"\"Luongcanban\"" +":"+ "\""+rs.getString("luongcanban")+"\""+","+"\"phai\"" +":"+
"\""+rs.getString("phai")+"\""+" , "+"\"ca\"" +":"+ "\""+rs.getString("ca")+"\""+" , "+"\"makv\"" +":"+ "\""+rs.getString("makv")+"\""+"}"+",";
}
} catch (SQLException ex) {
Logger.getLogger(Webserviceqlcoffeeshop.class.getName()).log(Level.SEVERE, null, ex); } kq1 = kq1.substring(0, kq1.length() - 1); kq2+=kq1; kq2+="]"; return kq2; } /**
* Web service operation */
@WebMethod(operationName = "Doctatcaloaimon") public String Doctatcaloaimon() {
String kq1 =""; String kq2="["; try {
Connection con = Database.layketnoi(); Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from loaimon"); while(rs.next()){
kq1+="{"+"\"maloai\""+":"+"\""+rs.getString("maloai")+"\""+","+"\"tenloai\"" +":"+ "\""+rs.getString("tenloai")+"\""+"}"+",";
}
} catch (SQLException ex) {
Logger.getLogger(Webserviceqlcoffeeshop.class.getName()).log(Level.SEVERE, null, ex); } kq1 = kq1.substring(0, kq1.length() - 1); kq2+=kq1; kq2+="]"; return kq2; } /**
@WebMethod(operationName = "Doctatcakhuvuc") public String Doctatcakhuvuc() {
String kq1 =""; String kq2="["; try {
Connection con = Database.layketnoi(); Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from khuvuc "); while(rs.next()){ kq1+="{"+"\"makhuvuc\""+":"+"\""+rs.getString("makv")+"\""+","+"\"tenkhuvuc\"" +":"+ "\""+rs.getString("tenkv")+"\""+"}"+","; }
} catch (SQLException ex) {
Logger.getLogger(Webserviceqlcoffeeshop.class.getName()).log(Level.SEVERE, null, ex); } kq1 = kq1.substring(0, kq1.length() - 1); kq2+=kq1; kq2+="]"; return kq2; } /**
* Web service operation */
@WebMethod(operationName = "Doctatcadangnhap") public String Doctatcadangnhap() {
String kq1 =""; String kq2="["; try {
Connection con = Database.layketnoi(); Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from dangnhap"); while(rs.next()){ // kq1+="{"+"\"don gia\""+":"+"\""+rs.getString("dongia")+"\""+"}"+","; kq1+="{"+"\"sothutu\""+":"+"\""+rs.getString("stt")+"\""+","+"\"manhanvien\"" +":"+ "\""+rs.getString("manv")+"\""+","+"\"tendangnhap\"" +":"+ "\""+rs.getString("tendn")+"\""+","+"\"matkhau\"" +":"+ "\""+rs.getString("matkhau")+"\""+","+"\"quyen\"" +":"+ "\""+rs.getString("quyen")+"\""+"}"+","; }
} catch (SQLException ex) {
Logger.getLogger(Webserviceqlcoffeeshop.class.getName()).log(Level.SEVERE, null, ex);
}
kq1 = kq1.substring(0, kq1.length() - 1); kq2+=kq1;
return kq2; }
/**
* Web service operation */
@WebMethod(operationName = "DoctatcaBan") public String DoctatcaBan() {
String kq1 =""; String kq2="["; try {
Connection con = Database.layketnoi(); Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from ban"); while(rs.next()){ kq1+="{"+"\"maban\""+":"+"\""+rs.getString("maban")+"\""+","+"\"tinhtrang\""+":"+"\" "+rs.getString("tinhtrang")+"\""+","+"\"tenban\"" +":"+ "\""+rs.getString("tenban")+"\""+","+"\"makhuvuc\""+":"+"\""+rs.getString("makv")+"\" "+"}"+","; }
} catch (SQLException ex) {
Logger.getLogger(Webserviceqlcoffeeshop.class.getName()).log(Level.SEVERE, null, ex);
} kq1 = kq1.substring(0, kq1.length() - 1); kq2+=kq1; kq2+="]"; return kq2; } /**
* Web service operation */
// dùng cho thêm qlthucdon
@WebMethod(operationName = "Themthucdon")
public String Themthucdon(@WebParam(name = "mamon") String mamon,
@WebParam(name = "tenmon") String tenmon, @WebParam(name = "DVT") String DVT, @WebParam(name = "dongia") String dongia, @WebParam(name = "maloai") String maloai, @WebParam(name = "hinhanh") String hinhanh) {
String loi = "";
float dongia1 = Float.parseFloat(dongia); try {
Connection con = Database.layketnoi();
String sql = "insert into thucdon (mamon,tenmon,DVT,dongia,maloai,hinhanh) values(?,?,?,?,?,?)";
pst.setString(2, tenmon); pst.setString(3, DVT); pst.setFloat(4, dongia1); pst.setString(5,maloai); pst.setString(6, hinhanh); pst.executeUpdate(); } catch (SQLException ex) { loi = ex.getMessage(); }
return loi; }
/**
* Web service operation */
// dùng cho thêm qlthucdon
@WebMethod(operationName = "Themloaimon")
public String Themloaimon(@WebParam(name = "maloai") String maloai, @WebParam(name = "tenloai") String tenloai) {
String loi = ""; try {
Connection con = Database.layketnoi();
String sql = "insert into loaimon (maloai,tenloai) values(?,?)"; PreparedStatement pst = con.prepareStatement(sql);
pst.setString(1,maloai); pst.setString(2, tenloai); pst.executeUpdate(); } catch (SQLException ex) { loi = ex.getMessage(); }
return loi; }
/**
* Web service operation */
//DÙNG ĐỂ UPDATE QLTHUCDON
@WebMethod(operationName = "updatethucdondatabase")
public String updatethucdondatabase(@WebParam(name = "mamon") String mamon, @WebParam(name = "tenmon") String tenmon, @WebParam(name = "dongia") String dongia, @WebParam(name = "maloai") String maloai, @WebParam(name = "hinhanh") String hinhanh, @WebParam(name = "khoa") String khoa) {
String loi = "";
float dongia1 = Float.parseFloat(dongia); try {
Connection con = Database.layketnoi(); String sql = "update thucdon set
PreparedStatement pst = con.prepareStatement(sql); pst.setString(1,mamon); pst.setString(2, tenmon); pst.setFloat(3, dongia1); pst.setString(4, maloai); pst.setString(5,hinhanh); pst.setString(6,khoa); pst.executeUpdate(); } catch (SQLException ex) { loi = ex.getMessage(); } return loi; } /**
* Web service operation */
@WebMethod(operationName = "Deleteqlthucdon")
public String Deleteqlthucdon(@WebParam(name = "mamon") String mamon) { String loi = "";
try {
Connection con = Database.layketnoi();
PreparedStatement pst = con.prepareStatement(sql); pst.setString(1,mamon);
pst.executeUpdate(); } catch (SQLException ex) { loi = ex.getMessage(); }
return loi; }
/**