时间太久了,数据库之类的不在了,没法打包资源上传,有粉丝想要完整代码,故更新一下。有资源需求之类的可以直接私信或者在评论区留言,博主会进行更改。
1. 绪论
1.1 课题目标
设计一个能够保证信息的准确性和时效性,随时通过计算机对系统进行管理,使得餐厅点餐各项信息合理传达给顾客和餐厅人员,保证具有选择就餐人数和餐桌、点餐、下单、加单、结账等功能的系统,并为餐厅点餐相关信息管理提供一种更加高效实用的管理手段,为餐厅点餐信息交流提供一种更加安全快捷的信息平台。
1.2 课题背景
随着当代科学社会的不断发展,我们所需要接收和处理的信息越来越多,很多东西逐渐难以通过单纯的人力劳动来解决。在信息过载的时代,由于计算机网络和人工智能的迅猛发展,越来越多的智能化设备、操作系统完成了对单调重复的劳动力的替代,使得众多行业领域的工作效率大大提高。
现在人们的社会需求越来越大,小型餐厅的规模不断的发展扩大,菜品数量和种类也在不断地增加,和点餐有关的信息也在不断地变多。餐厅员工每天通过手写记录大量点餐信息,工作量非常的大,容错率也不高。
传统的餐饮系统尤其是学生食堂的餐饮系统还是学生打菜的模式,依旧还是排队打菜的模式,对于消费者来说多了排队的时间,对于卖家来说过长的队伍可能会导致很多隐藏客户的流失,还有排在后面的人可能对于今天的菜品不是很了解,却又没有充足的时间挑选自己喜欢的。
餐饮行业最终要的就是一个买家卖家相互促进的良性循环,买家付出了金钱,得到了好的服务和消费体验,才会有回购的欲望,卖家的付出得到了收获,更容易有一个良好的心态来服务客户。很多问题会出现在点餐的这个过程,那么将这个人工过程交由系统来完成,会大大提高精准度和容错率。
1.3 开发意义
客户进入餐厅不再需要排队等待,只需要找到自己的位置,就可以进行点餐,所有菜品尽情翻阅,极大方便了客户的点餐环节,节省了人工服务过程,避免客户过长的等待时间产生的不耐。极大提升了客户的体验,对于卖家也就避免了可能产生的损失,省去了面对面服务的环节,只需要专心提高产品品质即可。
①减轻劳动强度、提高工作效率、增加餐厅点餐管理的透明度。餐厅点餐系统可以发挥计算机的强大功能,让餐厅员工从大量繁琐的手工劳动中解放出来,将单调枯燥的纸张涂写变成灵活的电子信息操作。并充分利用网络优势,加快餐厅内部各项信息的获取和传达,改善和优化餐厅各类人员的工作,使各个类群之间的工作联系紧密、井然有序、清楚明晰,大大减轻工作负担,提高工作效率,增加学生管理的透明度。
②降低管理成本,由于采用本系统的原因,使餐厅管理工作一改往日埋在各种表格中的被动局面,基本实现了无纸化办公,根除了很多日常管理中的浪费现象,体现出现代化餐厅点餐管理的优势。
③规范化管理,由于采用了计算机统计分析餐厅点餐信息,可以将错误降到最低,提高系统工作的准确率,从而餐厅点餐相关管理工作规范化。
2. 需求分析
2.1 需求描述
需求分析首先要确定研究分析的对象,这里的需求分析对象有两方:买家和卖家。
对于买家,需求是能够进行线上点餐,具体可以细化为:能够在线上获得餐品信息和进行点餐行为。买家作为消费者,都想得到更为优质的服务体验,希望能够通过较为简单顺利的操作就可以吃到满足自己口味的菜肴。这就要求系统界面能够生动形象地有效呈现出点餐的各项信息,菜品的价格、菜品的品相、可以选择就坐的餐桌的数目等情况以及加餐时简洁的操作界面。
对于卖家,需求是能够获得买家的订单,具体可以细化为,能够线上获得买家的下单餐品,用餐桌号等订单信息。卖家即为商家,商家要能够高效地获取顾客的信息,当然是图形化界面和几何形式的信息呈现最为直接明了,通过这些,自然能够合理把控消费者的消费诉求,从而能够给出更好的服务,让顾客有更好的体验。
2.2 数据流图
2.3 数据字典
数据项
表2-1数据项表
数据项名
数据项含义
数据类型
nu
点餐桌号
Char(10)
name
点餐菜名
Char(10)
桌号
桌号
Char(10)
人数
人数
Char(10)
总金额
总金额
Char(10)
数据结构
表2-2数据结构表
数据结构名
含义
组成
fo
尚未完成的订单
nu,name
zo
历史订单
桌号,人数,总金额
数据流
表2-3数据流表
数据流名
说明
数据流来源
数据流去向
组成
订单
餐品订单
顾客
卖家
桌号,人数,菜品,金额,总金额
2.4 概念结构设计E-R图
3. 系统设计
3.1 软件功能总体设计
3.2 软件功能详细设计
3.2.1 登录功能
在JAVA控制台运行源代码,首先会弹出登录界面,在此界面中输入创建好的账号和密码即可登录进入服务系统,若输入的账号和密码与数据库中用户表内所存的账号和密码清单不匹配,则会提示是否注册该账号,注册完后系统会将账号和密码存储到数据库中,此时再登录即可进入系统界面。
3.2.2 界面修改
在进入服务系统后,图形界面中有“界面样式设置”和“修改界面字体”两个按钮,这两个按钮分别负责其对应的功能,选择点击“界面样式设置”按钮后会弹出各种各样的界面样式以供选择,选择点击并确认后即可完成切换界面样式。选择点击“修改界面字体”按钮后会弹出各式各样的字体样式,选择点击并确认后即可完成修改界面字体。
3.2.3 点餐界面
点击选择服务界面中的“点餐”按钮后进入点餐界面,浏览到心仪菜品即可点击“加单”按钮将点餐数量暂存到系统内部的数组中,再点击“下单”按钮即可完成对餐品数量的存入,之后系统会统计菜品的总价,完成结账后即可退出。
3.2.4 结账界面
在服务界面中选择点击“菜单”按钮,找到“支付”按钮并选择点击,如果菜单中有存入的菜品及其相应数量,则会显示账单并完成支付;如果菜单为空,则跳转到添加菜品界面,方便顾客进行点餐等一系列操作。
4. 数据库设计
4.1 逻辑结构设计
zo(桌号,人数,总金额)
fo(nu,name,bool)
表3-1 zo属性表
属性名
数据类型
说明
桌号
Char(10)
订单桌号
人数
Char(10)
订单人数
总金额
Char(10)
消费金额
表3-2 fo属性表
属性名
数据类型
说明
nu
Char(10)
桌号
name
Char(10)
菜名
bool
Char(10)
是否完成订单
5 系统实现交互图
5.1 下单功能实现
登录界面:用户输入正确信息进入系统
![](https://img-blog.csdnimg.cn/2021070822333267.png)
图4-1登录界面
图4-2错误登录(1)
图4-3错误登录(2)
下单界面:用户选择产品下单
结账界面:用户选择完毕进行结账
界面定制:用户自定义界面形式
退出功能:用户根据选择退出登录
6. 完整源码
package 餐厅点餐系统;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Land {
private JFrame jf;
private JPanel jp1;
private JPanel jp2;
private JPanel jp3;
private JPanel jp4;
private JTextField jtf1;
private JPasswordField jpf1;
private JLabel jl1;
private JLabel jl2;
private JButton jb1;
private JButton jb2;
public void init() {
jf = new JFrame("登陆");
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp4 = new JPanel();
jtf1 = new JTextField(15);
jpf1 = new JPasswordField (15);
jpf1.setEchoChar('*');
jl1 = new JLabel("用户");
jl2 = new JLabel("密码");
jb1 = new JButton("登陆");
jb2 = new JButton("重置");
jf.setLayout(new GridLayout(3,1));
jf.add(jp2);
jf.add(jp3);
jf.add(jp4);
jp2.add(jl1);
jp2.add(jtf1);
jp3.add(jl2);
jp3.add(jpf1);
jp4.add(jb1);
jp4.add(jb2);
jb1.addActionListener(new ButtonListener());
jb2.addActionListener(new ButtonListener());
jf.pack();
jf.setLocation(400, 300);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setAlwaysOnTop(false);
}
private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
if("登陆".equals(command) && jtf1.getText().equals("123") && jpf1.getText().equals("123")) {
new System1().init(jtf1.getText());
jf.setVisible(false);
}
else if("登陆".equals(command) && jtf1.getText().equals("") && jpf1.getText().equals("")) {
JOptionPane.showMessageDialog(null,"请输入用户名和密码","提示",1);
}
else if("重置".equals(command)) {
jtf1.setText("");
jpf1.setText("");
}
else {
JOptionPane.showMessageDialog(null,"用户名或密码错误!","错误 ",0);
jtf1.setText("");
jpf1.setText("");
}
}
}
public static void showMessageDialog(Component parentComponent,Object message,String title,int messageType,Icon icon) {
}
public static void main(String[] args) {
new Land().init();
}
}
package 餐厅点餐系统;
import java.awt.*;
import javax.sql.rowset.WebRowSet;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.util.ArrayList;
import java.util.Vector;
import java.util.Calendar;
import java.util.Date;
import java.io.*;
import java.net.NoRouteToHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
//事件处理包
import java.awt.event.*;
public class System1 implements ActionListener{
//北部区域
JMenuBar jm1=new JMenuBar();
private JLabel jl1;
//南部区域
private JButton jb1, jb2, jb3, jb4 , jb5;
private JPanel jp1;
//西部区域
private JTabbedPane jtp2;
private JPanel jp8;
private JButton jb6, jb7, jb8, jb9, jb10, jb11;
//东部区域
private JPanel jp9;
private JComboBox jcb11;
private JLabel jl20, jl21, jl22;
private JTextField jtf2;
private JTable jt;
private JScrollPane jsp;
String[] jg = { "桌1", "桌2", "桌3", "桌4", "桌5", "桌6" };
private DefaultTableModel model;
private Vector data;
private Vector names;
//中部区域
private JTabbedPane jtp;// 选项卡窗格
private ImageIcon img;
private JPanel jp2, jp3, jp4, jp5, jp6, jp7;
private JLabel jl2, jl3, jl4, jl5, jl6, jl7, jl8, jl9, jl10, jl11, jl12, jl13, jl14, jl15, jl16, jl17, jl18, jl19;
private JCheckBox jcb1, jcb2, jcb3, jcb4, jcb5, jcb6, jcb7, jcb8, jcb9;
//判断
boolean B = true;
//文件输出
BufferedWriter out;
//主框架
JFrame jf;
public void init(String username) {
//北部区域
jl1 = new JLabel("*****课设餐厅欢迎您*****",JLabel.CENTER);
jl1.setOpaque(true);//设置背景颜色必须先将它设置为不透明的,因为默认是透明的。
jl1.setBackground(Color.pink);
Font f = new Font("楷体",Font.PLAIN,45);
jl1.setFont(f);
jl1.setForeground(Color.BLUE);
JMenu menu1=new JMenu("系统设置");
jm1.add(menu1);
JMenu menu2=new JMenu("餐厅名称字体");
JMenu menu3=new JMenu("餐厅名称颜色");
JMenuItem item9=new JMenuItem("退出登录");
menu1.add(menu2);
menu1.add(menu3);
menu1.addSeparator();
menu1.add(item9);
//设置监听退出登录
item9.addActionListener(new ActionListener() {
@Override
public void actionPerformed( ActionEvent e) {
int i=JOptionPane.showConfirmDialog(null, "是否退出登录","退出登录",JOptionPane.YES_NO_OPTION);
if(i == JOptionPane.YES_OPTION) {
jf.setVisible(false);
new Land().init();
}
}
});
//菜单栏设置标题字体
JMenuItem item1=new JMenuItem("楷体");
JMenuItem item2=new JMenuItem("宋体");
JMenuItem item3=new JMenuItem("黑体");
JMenuItem item4=new JMenuItem("正文");
menu2.add(item1);
menu2.add(item2);
menu2.add(item3);
menu2.add(item4);
item1.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e) {
Font f = new Font("楷体",Font.PLAIN,45);
jl1.setFont(f);
}
});
item2.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e) {
Font f = new Font("宋体",Font.PLAIN,45);
jl1.setFont(f);
}
});
item3.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e) {
Font f = new Font("黑体",Font.PLAIN,45);
jl1.setFont(f);
}
});
item4.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e) {
Font f = new Font("正文",Font.PLAIN,45);
jl1.setFont(f);
}
});
//菜单栏设置标题颜色
JMenuItem item5=new JMenuItem("蓝色");
JMenuItem item6=new JMenuItem("红色");
JMenuItem item7=new JMenuItem("黑色");
JMenuItem item8=new JMenuItem("绿色");
menu3.add(item5);
menu3.add(item6);
menu3.add(item7);
menu3.add(item8);
item5.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e) {
jl1.setForeground(Color.BLUE);
}
});
item6.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e) {
jl1.setForeground(Color.RED);
}
});
item7.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e) {
jl1.setForeground(Color.BLACK);
}
});
item8.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e) {
jl1.setForeground(Color.green);
}
});
//南部区域
jp1 = new JPanel();
jb1 = new JButton("取消");
jb2 = new JButton("下单");
jb3 = new JButton("加单");
jb4 = new JButton("结账");
//西部区域
jtp2 = new JTabbedPane();
jp8 = new JPanel();
jb6 = new JButton("热销菜式");
jb7 = new JButton("小炒类");
jb8 = new JButton("蔬菜类");
jb9 = new JButton("主食类");
jb10 = new JButton("甜品类");
jb11 = new JButton("饮品类");
//东部区域
jp9 = new JPanel();
jl20 = new JLabel("请选择桌号:");
jcb11 = new JComboBox(jg);
jl21 = new JLabel("请输入用餐人数:");
jtf2 = new JTextField();
jl22 = new JLabel("已点菜式列表:");
model = new DefaultTableModel(); // 新建一个默认数据模型
data = new Vector(); // 数据行向量集,因为列表不止一行,往里面添加数据行向量,添加方法add(row)
names = new Vector();// 列名向量,使用它的add()方法添加列名
names.add("菜名");
names.add("价格(元)");
model.setDataVector(data,names); // 设置模型中的元素,它会自动显示在列表中
jt = new JTable(model); // 用数据模型创建JTable,JTable会自动监听到数据模型中的数据改变并显示出来
jsp = new JScrollPane(jt); // 用列表创建可滚动的Panel,把这个Panel添加到窗口中
//中部区域
jtp = new JTabbedPane();
img=new ImageIcon("主食类//红烧肉.jpg");//创建一个图标
jl2 = new JLabel(img);
img=new ImageIcon("主食类//红烧猪蹄.jpg");
jl3 = new JLabel(img);
img=new ImageIcon("主食类//家常炒面.jpg");
jl4 = new JLabel(img);
img=new ImageIcon("小炒类//家常小炒.jpg");
jl5 = new JLabel(img);
img=new ImageIcon("小炒类//木须肉.jpg");
jl6 = new JLabel(img);
img=new ImageIcon("小炒类//小炒圆白菜.jpg");
jl7 = new JLabel(img);
img=new ImageIcon("蔬菜类//苦瓜炒蛋.jpg");
jl8 = new JLabel(img);
img=new ImageIcon("蔬菜类//炒四季豆.jpg");
jl9 = new JLabel(img);
img=new ImageIcon("蔬菜类//凉拌土豆丝.jpg");
jl10 = new JLabel(img);
jl11 = new JLabel("39",JLabel.CENTER);
jl12 = new JLabel("39",JLabel.CENTER);
jl13 = new JLabel("39",JLabel.CENTER);
jl14 = new JLabel("28",JLabel.CENTER);
jl15 = new JLabel("28",JLabel.CENTER);
jl16 = new JLabel("28",JLabel.CENTER);
jl17 = new JLabel("18",JLabel.CENTER);
jl18 = new JLabel("18",JLabel.CENTER);
jl19 = new JLabel("18",JLabel.CENTER);
jcb1 = new JCheckBox("红烧肉");
jcb2 = new JCheckBox("红烧猪蹄");
jcb3 = new JCheckBox("家常炒面");
jcb4 = new JCheckBox("家常小炒");
jcb5 = new JCheckBox("木须肉");
jcb6 = new JCheckBox("小炒圆白菜");
jcb7 = new JCheckBox("苦瓜炒蛋");
jcb8 = new JCheckBox("炒四季豆");
jcb9 = new JCheckBox("凉拌土豆丝");
jp2 = new JPanel();
jp3 = new JPanel();
jp4 = new JPanel();
jp5 = new JPanel();
jp6 = new JPanel();
jp7 = new JPanel();
//将面板添加到选项卡窗格上
jtp.add("热销菜式", jp2);
jtp.add("小炒类", jp3);
jtp.add("蔬菜类", jp4);
jtp.add("主食类", jp5);
jtp.add("甜品类", jp6);
jtp.add("饮品类", jp7);
jtp2.add("菜式导航", jp8);
//设置布局
jp2.setLayout(new GridLayout(9,3));
jp3.setLayout(new GridLayout(9,3));
jp4.setLayout(new GridLayout(9,3));
jp5.setLayout(new GridLayout(9,3));
jp6.setLayout(new GridLayout(9,3));
jp7.setLayout(new GridLayout(9,3));
jp8.setLayout(new GridLayout(15,1));
jp9.setLayout(new GridLayout(6,1));
jp9.setPreferredSize(new Dimension(250, 0));
//指定action 命令
jb1.addActionListener(this);
jb1.setActionCommand("取消");
jb2.addActionListener(this);
jb2.setActionCommand("下单");
jb3.addActionListener(this);
jb3.setActionCommand("加单");
jb4.addActionListener(this);
jb4.setActionCommand("结账");
jb6.addActionListener(this);
jb6.setActionCommand("热销菜式");
jb7.addActionListener(this);
jb7.setActionCommand("小炒类");
jb8.addActionListener(this);
jb8.setActionCommand("蔬菜类");
jb9.addActionListener(this);
jb9.setActionCommand("主食类");
jb10.addActionListener(this);
jb10.setActionCommand("甜品类");
jb11.addActionListener(this);
jb11.setActionCommand("饮品类");
//添加组件
jp1.add(jb1);
jp1.add(jb2);
jp1.add(jb3);
jp1.add(jb4);
jp2.add(jl2);
jp2.add(jl3);
jp2.add(jl4);
jp2.add(jl11);
jp2.add(jl12);
jp2.add(jl13);
jp2.add(jcb1);
jp2.add(jcb2);
jp2.add(jcb3);
jp2.add(jl5);
jp2.add(jl6);
jp2.add(jl7);
jp2.add(jl14);
jp2.add(jl15);
jp2.add(jl16);
jp2.add(jcb4);
jp2.add(jcb5);
jp2.add(jcb6);
jp2.add(jl8);
jp2.add(jl9);
jp2.add(jl10);
jp2.add(jl17);
jp2.add(jl18);
jp2.add(jl19);
jp2.add(jcb7);
jp2.add(jcb8);
jp2.add(jcb9);
jp8.add(jb6);
jp8.add(jb7);
jp8.add(jb8);
jp8.add(jb9);
jp8.add(jb10);
jp8.add(jb11);
jp9.add(jl20);
jp9.add(jcb11);
jp9.add(jl21);
jp9.add(jtf2);
jp9.add(jl22);
jp9.add(jsp);
//续中部区域
//小炒类
img=new ImageIcon("小炒类//豆角炒腊肉.jpg");
jl2 = new JLabel(img);
img=new ImageIcon("小炒类//家常小炒.jpg");
jl3 = new JLabel(img);
img=new ImageIcon("小炒类//木须肉.jpg");
jl4 = new JLabel(img);
img=new ImageIcon("小炒类//农家小炒肉.jpg");
jl5 = new JLabel(img);
img=new ImageIcon("小炒类//四季豆小炒肉.jpg");
jl6 = new JLabel(img);
img=new ImageIcon("小炒类//小炒牛肉.jpg");
jl7 = new JLabel(img);
img=new ImageIcon("小炒类//小炒香菇黄瓜条.jpg");
jl8 = new JLabel(img);
img=new ImageIcon("小炒类//小炒圆白菜.jpg");
jl9 = new JLabel(img);
img=new ImageIcon();
jl10 = new JLabel(img);
jl11 = new JLabel("28",JLabel.CENTER);
jl12 = new JLabel("28",JLabel.CENTER);
jl13 = new JLabel("28",JLabel.CENTER);
jl14 = new JLabel("28",JLabel.CENTER);
jl15 = new JLabel("28",JLabel.CENTER);
jl16 = new JLabel("28",JLabel.CENTER);
jl17 = new JLabel("28",JLabel.CENTER);
jl18 = new JLabel("28",JLabel.CENTER);
jl19 = new JLabel("",JLabel.CENTER);
jcb1 = new JCheckBox("豆角炒腊肉");
jcb2 = new JCheckBox("家常小炒");
jcb3 = new JCheckBox("木须肉");
jcb4 = new JCheckBox("农家小炒肉");
jcb5 = new JCheckBox("四季豆小炒肉");
jcb6 = new JCheckBox("小炒牛肉");
jcb7 = new JCheckBox("小炒香菇黄瓜条");
jcb8 = new JCheckBox("小炒圆白菜");
jp3.add(jl2);
jp3.add(jl3);
jp3.add(jl4);
jp3.add(jl11);
jp3.add(jl12);
jp3.add(jl13);
jp3.add(jcb1);
jp3.add(jcb2);
jp3.add(jcb3);
jp3.add(jl5);
jp3.add(jl6);
jp3.add(jl7);
jp3.add(jl14);
jp3.add(jl15);
jp3.add(jl16);
jp3.add(jcb4);
jp3.add(jcb5);
jp3.add(jcb6);
jp3.add(jl8);
jp3.add(jl9);
jp3.add(jl10);
jp3.add(jl17);
jp3.add(jl18);
jp3.add(jl19);
jp3.add(jcb7);
jp3.add(jcb8);
//蔬菜类
img=new ImageIcon("蔬菜类//炒四季豆.jpg");
jl2 = new JLabel(img);
img=new ImageIcon("蔬菜类//苦瓜炒蛋.jpg");
jl3 = new JLabel(img);
img=new ImageIcon("蔬菜类//凉拌土豆丝.jpg");
jl4 = new JLabel(img);
img=new ImageIcon("蔬菜类//茄子肉末.jpg");
jl5 = new JLabel(img);
img=new ImageIcon("蔬菜类//豌豆炒鸡米.jpg");
jl6 = new JLabel(img);
img=new ImageIcon("蔬菜类//虾酱荷兰豆.jpg");
jl7 = new JLabel(img);
img=new ImageIcon("蔬菜类//腰果玉米.jpg");
jl8 = new JLabel(img);
img=new ImageIcon();
jl9 = new JLabel(img);
img=new ImageIcon();
jl10 = new JLabel(img);
jl11 = new JLabel("18",JLabel.CENTER);
jl12 = new JLabel("18",JLabel.CENTER);
jl13 = new JLabel("18",JLabel.CENTER);
jl14 = new JLabel("18",JLabel.CENTER);
jl15 = new JLabel("18",JLabel.CENTER);
jl16 = new JLabel("18",JLabel.CENTER);
jl17 = new JLabel("18",JLabel.CENTER);
jl18 = new JLabel("",JLabel.CENTER);
jl19 = new JLabel("",JLabel.CENTER);
jcb1 = new JCheckBox("炒四季豆");
jcb2 = new JCheckBox("苦瓜炒蛋");
jcb3 = new JCheckBox("凉拌土豆丝");
jcb4 = new JCheckBox("茄子肉末");
jcb5 = new JCheckBox("豌豆炒鸡米");
jcb6 = new JCheckBox("虾酱荷兰豆");
jcb7 = new JCheckBox("腰果玉米");
jp4.add(jl2);
jp4.add(jl3);
jp4.add(jl4);
jp4.add(jl11);
jp4.add(jl12);
jp4.add(jl13);
jp4.add(jcb1);
jp4.add(jcb2);
jp4.add(jcb3);
jp4.add(jl5);
jp4.add(jl6);
jp4.add(jl7);
jp4.add(jl14);
jp4.add(jl15);
jp4.add(jl16);
jp4.add(jcb4);
jp4.add(jcb5);
jp4.add(jcb6);
jp4.add(jl8);
jp4.add(jl9);
jp4.add(jl10);
jp4.add(jl17);
jp4.add(jl18);
jp4.add(jl19);
jp4.add(jcb7);
//主食类
img=new ImageIcon("主食类//红烧肉.jpg");
jl2 = new JLabel(img);
img=new ImageIcon("主食类//红烧猪蹄.jpg");
jl3 = new JLabel(img);
img=new ImageIcon("主食类//家常炒面.jpg");
jl4 = new JLabel(img);
img=new ImageIcon("主食类//金牌海鲜炒饭.jpg");
jl5 = new JLabel(img);
img=new ImageIcon("主食类//糖醋排骨.jpg");
jl6 = new JLabel(img);
img=new ImageIcon("主食类//新奥尔良烤翅.jpg");
jl7 = new JLabel(img);
img=new ImageIcon("主食类//照烧鸡腿.jpg");
jl8 = new JLabel(img);
img=new ImageIcon();
jl9 = new JLabel(img);
img=new ImageIcon();
jl10 = new JLabel(img);
jl11 = new JLabel("39",JLabel.CENTER);
jl12 = new JLabel("39",JLabel.CENTER);
jl13 = new JLabel("39",JLabel.CENTER);
jl14 = new JLabel("39",JLabel.CENTER);
jl15 = new JLabel("39",JLabel.CENTER);
jl16 = new JLabel("39",JLabel.CENTER);
jl17 = new JLabel("39",JLabel.CENTER);
jl18 = new JLabel("",JLabel.CENTER);
jl19 = new JLabel("",JLabel.CENTER);
jcb1 = new JCheckBox("红烧肉");
jcb2 = new JCheckBox("红烧猪蹄");
jcb3 = new JCheckBox("家常炒面");
jcb4 = new JCheckBox("金牌海鲜炒饭");
jcb5 = new JCheckBox("糖醋排骨");
jcb6 = new JCheckBox("新奥尔良烤翅");
jcb7 = new JCheckBox("照烧鸡腿");
jp5.add(jl2);
jp5.add(jl3);
jp5.add(jl4);
jp5.add(jl11);
jp5.add(jl12);
jp5.add(jl13);
jp5.add(jcb1);
jp5.add(jcb2);
jp5.add(jcb3);
jp5.add(jl5);
jp5.add(jl6);
jp5.add(jl7);
jp5.add(jl14);
jp5.add(jl15);
jp5.add(jl16);
jp5.add(jcb4);
jp5.add(jcb5);
jp5.add(jcb6);
jp5.add(jl8);
jp5.add(jl9);
jp5.add(jl10);
jp5.add(jl17);
jp5.add(jl18);
jp5.add(jl19);
jp5.add(jcb7);
//甜品类
img=new ImageIcon("甜品类//红豆马蹄糕.jpg");
jl2 = new JLabel(img);
img=new ImageIcon("甜品类//红糖鸡蛋.jpg");
jl3 = new JLabel(img);
img=new ImageIcon("甜品类//榴莲酥.jpg");
jl4 = new JLabel(img);
img=new ImageIcon("甜品类//芒果糯米糍.jpg");
jl5 = new JLabel(img);
img=new ImageIcon("甜品类//全麦小餐包.jpg");
jl6 = new JLabel(img);
img=new ImageIcon("甜品类//杂果榴莲冰.jpg");
jl7 = new JLabel(img);
img=new ImageIcon("甜品类//紫薯汤圆.jpg");
jl8 = new JLabel(img);
img=new ImageIcon();
jl9 = new JLabel(img);
img=new ImageIcon();
jl10 = new JLabel(img);
jl11 = new JLabel("12",JLabel.CENTER);
jl12 = new JLabel("12",JLabel.CENTER);
jl13 = new JLabel("12",JLabel.CENTER);
jl14 = new JLabel("12",JLabel.CENTER);
jl15 = new JLabel("12",JLabel.CENTER);
jl16 = new JLabel("12",JLabel.CENTER);
jl17 = new JLabel("12",JLabel.CENTER);
jl18 = new JLabel("",JLabel.CENTER);
jl19 = new JLabel("",JLabel.CENTER);
jcb1 = new JCheckBox("红豆马蹄糕");
jcb2 = new JCheckBox("红糖鸡蛋");
jcb3 = new JCheckBox("榴莲酥");
jcb4 = new JCheckBox("芒果糯米糍");
jcb5 = new JCheckBox("全麦小餐包");
jcb6 = new JCheckBox("杂果榴莲冰");
jcb7 = new JCheckBox("紫薯汤圆");
jp6.add(jl2);
jp6.add(jl3);
jp6.add(jl4);
jp6.add(jl11);
jp6.add(jl12);
jp6.add(jl13);
jp6.add(jcb1);
jp6.add(jcb2);
jp6.add(jcb3);
jp6.add(jl5);
jp6.add(jl6);
jp6.add(jl7);
jp6.add(jl14);
jp6.add(jl15);
jp6.add(jl16);
jp6.add(jcb4);
jp6.add(jcb5);
jp6.add(jcb6);
jp6.add(jl8);
jp6.add(jl9);
jp6.add(jl10);
jp6.add(jl17);
jp6.add(jl18);
jp6.add(jl19);
jp6.add(jcb7);
//饮品类
img=new ImageIcon("饮品类//补气养颜饮.jpg");
jl2 = new JLabel(img);
img=new ImageIcon("饮品类//玫瑰陈皮饮.jpg");
jl3 = new JLabel(img);
img=new ImageIcon("饮品类//梅子冬瓜饮.jpg");
jl4 = new JLabel(img);
img=new ImageIcon("饮品类//木瓜红枣饮.jpg");
jl5 = new JLabel(img);
img=new ImageIcon("饮品类//苹果牛奶饮.jpg");
jl6 = new JLabel(img);
img=new ImageIcon("饮品类//苹果雪梨饮.jpg");
jl7 = new JLabel(img);
img=new ImageIcon("饮品类//肉桂姜糖饮.jpg");
jl8 = new JLabel(img);
img=new ImageIcon();
jl9 = new JLabel(img);
img=new ImageIcon();
jl10 = new JLabel(img);
jl11 = new JLabel("28",JLabel.CENTER);
jl12 = new JLabel("28",JLabel.CENTER);
jl13 = new JLabel("28",JLabel.CENTER);
jl14 = new JLabel("28",JLabel.CENTER);
jl15 = new JLabel("28",JLabel.CENTER);
jl16 = new JLabel("28",JLabel.CENTER);
jl17 = new JLabel("28",JLabel.CENTER);
jl18 = new JLabel("",JLabel.CENTER);
jl19 = new JLabel("",JLabel.CENTER);
jcb1 = new JCheckBox("补气养颜饮");
jcb2 = new JCheckBox("玫瑰陈皮饮");
jcb3 = new JCheckBox("梅子冬瓜饮");
jcb4 = new JCheckBox("木瓜红枣饮");
jcb5 = new JCheckBox("苹果牛奶饮");
jcb6 = new JCheckBox("苹果雪梨饮");
jcb7 = new JCheckBox("肉桂姜糖饮");
jp7.add(jl2);
jp7.add(jl3);
jp7.add(jl4);
jp7.add(jl11);
jp7.add(jl12);
jp7.add(jl13);
jp7.add(jcb1);
jp7.add(jcb2);
jp7.add(jcb3);
jp7.add(jl5);
jp7.add(jl6);
jp7.add(jl7);
jp7.add(jl14);
jp7.add(jl15);
jp7.add(jl16);
jp7.add(jcb4);
jp7.add(jcb5);
jp7.add(jcb6);
jp7.add(jl8);
jp7.add(jl9);
jp7.add(jl10);
jp7.add(jl17);
jp7.add(jl18);
jp7.add(jl19);
jp7.add(jcb7);
// 展示组件
jf = new JFrame("点菜系统");
jf.setSize(860, 635);
jf.setJMenuBar(jm1);
jf.setLayout(new BorderLayout(10,0)); //组件间距
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.add(jp1,BorderLayout.SOUTH);
jf.add(jl1,BorderLayout.NORTH);
jf.add(jtp,BorderLayout.CENTER);
jf.add(jtp2,BorderLayout.WEST);
jf.add(jp9,BorderLayout.EAST);
}
//监听器
public void actionPerformed(ActionEvent e) {
//判断哪个按钮被点击
switch(e.getActionCommand()) {
case "取消":
ForJCheckBox(jp2);
ForJCheckBox(jp3);
ForJCheckBox(jp4);
ForJCheckBox(jp5);
ForJCheckBox(jp6);
ForJCheckBox(jp7);
break;
case "下单":
if(B && ForJCheckBoxnum(jp9)) {
ForJCheckBoxStr(jp2,data,names,model,jt);
ForJCheckBoxStr(jp3,data,names,model,jt);
ForJCheckBoxStr(jp4,data,names,model,jt);
ForJCheckBoxStr(jp5,data,names,model,jt);
ForJCheckBoxStr(jp6,data,names,model,jt);
ForJCheckBoxStr(jp7,data,names,model,jt);
jp9.add(jsp);
B = false;
}
else if(ForJCheckBoxnum(jp9) == false) {
JOptionPane.showMessageDialog(null, "请输入用餐人数", "下单错误", JOptionPane.ERROR_MESSAGE);
}
else {
JOptionPane.showMessageDialog(null, "您已下单,若需要点菜请点击加单按钮", "下单错误", JOptionPane.ERROR_MESSAGE);
ForJCheckBox(jp2);
ForJCheckBox(jp3);
ForJCheckBox(jp4);
ForJCheckBox(jp5);
ForJCheckBox(jp6);
ForJCheckBox(jp7);
}
break;
case "加单":
if(B == false) {
ForJCheckBoxStr(jp2,data,names,model,jt);
ForJCheckBoxStr(jp3,data,names,model,jt);
ForJCheckBoxStr(jp4,data,names,model,jt);
ForJCheckBoxStr(jp5,data,names,model,jt);
ForJCheckBoxStr(jp6,data,names,model,jt);
ForJCheckBoxStr(jp7,data,names,model,jt);
jp9.add(jsp);
}
else {
JOptionPane.showMessageDialog(null, "您还未下单,请先点击下单按钮", "加单错误", JOptionPane.ERROR_MESSAGE);
ForJCheckBox(jp2);
ForJCheckBox(jp3);
ForJCheckBox(jp4);
ForJCheckBox(jp5);
ForJCheckBox(jp6);
ForJCheckBox(jp7);
}
break;
case "结账":
if(jt.getRowCount() != 0) {
int res = JOptionPane.showConfirmDialog(null, "是否继续操作", "结账提示", JOptionPane.YES_NO_OPTION);
if (res == JOptionPane.YES_OPTION) {
JDialog FRAME = new JDialog();//构造一个新的JFrame,作为新窗口。
FRAME.setSize(1000, 400);
FRAME.setLocation(300, 200);
FRAME.setBounds(new Rectangle((int) jf.getBounds().getX() + 50,(int) jf.getBounds().getY() + 50, (int) jf.getBounds().getWidth(), (int) jf.getBounds().getHeight()));
FRAME.add(jsp,BorderLayout.NORTH);
JButton button = new JButton("结账");
FRAME.add(button,BorderLayout.WEST);
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
FRAME.dispose();
}
});
try {
ForJCheckBoxnum(jp9,FRAME);
} catch (IOException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
FRAME.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);// 设置模式类型。
FRAME.setVisible(true);
B = true;
((DefaultTableModel)jt.getModel()).getDataVector().clear();// 清空前一人的菜单
break;
} else {
break;
}
}else {
JOptionPane.showMessageDialog(null, "您还未下单,不能进行结账", "结账错误", JOptionPane.ERROR_MESSAGE);
ForJCheckBox(jp2);
ForJCheckBox(jp3);
ForJCheckBox(jp4);
ForJCheckBox(jp5);
ForJCheckBox(jp6);
ForJCheckBox(jp7);
}
case "热销菜式":
jtp.setSelectedIndex(0);//切换卡片
break;
case "小炒类":
jtp.setSelectedIndex(1);
break;
case "蔬菜类":
jtp.setSelectedIndex(2);
break;
case "主食类":
jtp.setSelectedIndex(3);
break;
case "甜品类":
jtp.setSelectedIndex(4);
break;
case "饮品类":
jtp.setSelectedIndex(5);
break;
}
}
//将已勾选的取消
void ForJCheckBox(JPanel p) {
int count = p.getComponentCount();
for (int i = 0; i < count; i++) {
Component comp = p.getComponent(i);
if(comp instanceof JCheckBox){
JCheckBox jcb = (JCheckBox)comp;
if(jcb.isSelected()) {
jcb.setSelected(false);
}
}
}
}
//记录餐桌号、用餐人数、时间、菜名、价格、总金额
void ForJCheckBoxnum(JPanel p,JDialog FRAME) throws SQLException, IOException {
String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=shop";
String userName="sa";
String userPwd="123456";
Connection dbConn=DriverManager.getConnection(dbURL,userName,userPwd);
Statement state=dbConn.createStatement();
PreparedStatement ps=dbConn.prepareStatement("insert into fo1(nu,name,bool) values(?,?,?)");
for(int i=0; i<jt.getRowCount(); i++)
{
String str = (String)jt.getValueAt(i, 0);
ps.setString(1,jg[jcb11.getSelectedIndex()]);
ps.setString(2,str);
ps.setInt(3,0);
ps.executeUpdate();
}
int rowCount=jt.getRowCount();
int sum = 0;
String b = null;
for(int i=0; i<rowCount; i++) {
String str = (String)jt.getValueAt(i, 0);//取得第i行第一列的数据
str = ((String)jt.getValueAt(i, 1));//取得第i行第二列的数据
try {
int a = Integer.parseInt(str);
sum = sum+a;
b = Integer.toString(sum);
}
catch (NumberFormatException e) {
e.printStackTrace();
}
}
PreparedStatement ps2=dbConn.prepareStatement("insert into zo(桌号,人数,总金额) values(?,?,?)");
ps2.setString(1,jg[jcb11.getSelectedIndex()]);
ps2.setString(2,jtf2.getText());
ps2.setString(3,b);
ps2.executeUpdate();
JLabel JL = new JLabel("总金额:"+b,JLabel.CENTER);
FRAME.add(JL,BorderLayout.SOUTH);
}
//判断是否输入用餐人数
boolean ForJCheckBoxnum(JPanel p) {
int count = p.getComponentCount();
for(int i=0; i<count; i++) {
Component comp = p.getComponent(i);
if(comp instanceof JTextField) {
JTextField jtf = (JTextField)comp;
if(jtf.getText().equals(""))return false;
}
}return true;
}
//向JTable添加已点菜式及价格
void ForJCheckBoxStr(JPanel p,Vector data,Vector names,DefaultTableModel model,JTable jt) {
int count = p.getComponentCount();
for(int i=0; i<count; i++) {
Component comp = p.getComponent(i);
if(comp instanceof JCheckBox) {
JCheckBox jcb = (JCheckBox)comp;
if(jcb.isSelected()) {
jcb.setSelected(false);
Component Comp = p.getComponent(i-3);
JLabel jl = (JLabel)Comp;
Vector Row = new Vector();
Row.add(jcb.getText());
Row.add(jl.getText());
data.add(Row.clone());
model = new DefaultTableModel(data, names);
jt.setModel(model);
}
}
}
}
}
7. 项目课题总结
本课题使用面向对象软件工程方法,进行的分析与设计,使用面向java编程技术,进行的系统实现,有如下优点:
(1)本课题采用面向对象分析与设计方法,对同类型软件开发的分析设计过程提供一定的参考。
(2)极大增强程序的扩展性。对某一对象单独修改,会反映整个体系。
(3)提高了开发效率,更加符合人类的思维。
(4)java语言可以“一次编译,到处运行”。
本课题还有如下需要改进的地方:
(1)配套的接单功能
(2)数据的存储不够合理
(3)数据关系设计不够合理
(4)可以根据产品销量对产品进行排序,向客户进行推荐
(5)可以添加评论区以供用户对产品进行评价
(6)可以添加预购功能方便个性化订餐
(7)可以添加用户注册功能配合用户管理系统方便用户管理
版权归原作者 米莱虾 所有, 如有侵权,请联系我们删除。