满汉楼02

4.功能实现04

4.6显示所有菜品

4.6.1思路分析

创建一个菜单表menu,在Domain层创建与菜单表对应的Javabean-Menu类,在DAO层创建MenuDAO,完成对menu表的增删改查,在Service层创建一个和menu表相关的service类,service类提供给界面层使用

4.6.2代码实现

1.创建menu表
-- 创建menu表(id,name,type,price)
CREATE TABLE menu(
id INT PRIMARY KEY AUTO_INCREMENT,#自增主键,作为菜谱编号(唯一)
NAME VARCHAR(50) NOT NULL DEFAULT '',#菜品名称
TYPE VARCHAR(50) NOT NULL DEFAULT '',#菜品种类
price DOUBLE NOT NULL DEFAULT 0 #价格
)CHARSET=utf8 -- 添加测试数据
INSERT INTO menu VALUES(NULL,'八宝饭','主食',10);
INSERT INTO menu VALUES(NULL,'叉烧包','主食',20);
INSERT INTO menu VALUES(NULL,'宫保鸡丁','热菜',30);
INSERT INTO menu VALUES(NULL,'山药拨鱼','凉菜',14);
INSERT INTO menu VALUES(NULL,'银丝卷','甜食',9);
INSERT INTO menu VALUES(NULL,'水煮鱼','热菜',26);
INSERT INTO menu VALUES(NULL,'甲鱼汤','汤菜',100);
INSERT INTO menu VALUES(NULL,'鸡蛋汤','汤菜',16);

2.创建Menu类
package com.li.mhl.domain;

/**
* @author 李
* @version 1.0
* 该类和menu表对应
*/
public class Menu {
/**
* Field Type Null Key Default Extra
* ------ ----------- ------ ------ ------- ----------------
* id int(11) NO PRI (NULL) auto_increment
* name varchar(50) NO
* type varchar(50) NO
* price double NO 0
*/
private Integer id;
private String name;
private String type;
private Double price; public Menu() {
} public Menu(Integer id, String name, String type, Double price) {
this.id = id;
this.name = name;
this.type = type;
this.price = price;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public Double getPrice() {
return price;
} public void setPrice(Double price) {
this.price = price;
} @Override
public String toString() {
return id + "\t\t\t" + name + "\t\t" + type + "\t\t" + price;
} }
3.创建MenuDAO类
package com.li.mhl.dao;

import com.li.mhl.domain.Menu;

/**
* @author 李
* @version 1.0
*/
public class MenuDAO extends BasicDAO<Menu>{ }
4.创建MenuService类
package com.li.mhl.service;

import com.li.mhl.dao.MenuDAO;
import com.li.mhl.domain.Menu; import java.util.List; /**
* @author 李
* @version 1.0
* 完成对menu表的各种操作(通过调用MenuDAO)
*/
public class MenuService {
//定义MenuDAO属性
private MenuDAO menuDAO = new MenuDAO(); //编写方法,查询所有菜品(返回所有的菜品给界面使用)
public List<Menu> list() {
return menuDAO.queryMulti("select * from menu", Menu.class);
}
}

5.修改MHLView

修改处1:定义属性

//定义MenuService属性
private MenuService menuService = new MenuService();

修改处2:编写方法

//显示所有菜品
public void listMenu() {
List<Menu> list = menuService.list();
System.out.println("\n菜品编号\t\t菜品名\t\t类别\t\t价格");
for (Menu menu: list) {
System.out.println(menu);
}
System.out.println("============显示完毕============");
}

修改处3:在内层循环的二级菜单中调用该方法

4.6.3测试

测试通过

4.7点餐功能

4.7.1功能说明

4.7.2思路分析

功能如上图所示,分析如下:

  1. 在输入点餐桌号和菜品编号时都需要对其进行合理性校验,如果不合理,给出提示信息
  2. 当点餐成功之后,餐桌的状态state应该发生变化,由已经预定变为进餐中
  3. 一旦点餐,就应该生成账单

根据上述的分析,整体的框架应该如下:

4.7.3代码实现

1.创建bill表
-- 创建bill账单表(id,billId,menuId,nums,billDate,money,state,diningTableId)
#账单流水, 考虑可以分开结账, 并考虑将来分别统计各个不同菜品的销售情况
CREATE TABLE bill (
id INT PRIMARY KEY AUTO_INCREMENT, #自增主键
billId VARCHAR(50) NOT NULL DEFAULT '',#账单号可以按照自己规则生成 UUID
menuId INT NOT NULL DEFAULT 0,#菜品的编号, 也可以使用外键
nums SMALLINT NOT NULL DEFAULT 0,#份数
money DOUBLE NOT NULL DEFAULT 0, #金额
diningTableId INT NOT NULL DEFAULT 0, #餐桌
billDate DATETIME NOT NULL ,#订单日期
state VARCHAR(50) NOT NULL DEFAULT '' # 状态 '未结账' , '已经结账-现金/支付宝', '挂单'
)CHARSET=utf8;

2.创建Bill类
package com.li.mhl.domain;

import java.util.Date;

/**
* @author 李
* @version 1.0
* 该类和 bill表对应
*/
public class Bill {
/**
* Field Type Null Key Default Extra
* ------------- ----------- ------ ------ ------- ----------------
* id int(11) NO PRI (NULL) auto_increment
* billId varchar(50) NO
* menuId int(11) NO 0
* nums smallint(6) NO 0
* money double NO 0
* diningTableId int(11) NO 0
* billDate datetime NO (NULL)
* state varchar(50) NO
*/
private Integer id;
private String billId;
private Integer menuId;
private Integer nums;
private Double money;
private Integer diningTableId;
private Date billDate;
private String state; public Bill() {
} public Bill(Integer id, String billId, Integer menuId, Integer nums, Double money, Integer diningTableId, Date billDate, String state) {
this.id = id;
this.billId = billId;
this.menuId = menuId;
this.nums = nums;
this.money = money;
this.diningTableId = diningTableId;
this.billDate = billDate;
this.state = state;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getBillId() {
return billId;
} public void setBillId(String billId) {
this.billId = billId;
} public Integer getMenuId() {
return menuId;
} public void setMenuId(Integer menuId) {
this.menuId = menuId;
} public Integer getNums() {
return nums;
} public void setNums(Integer nums) {
this.nums = nums;
} public Double getMoney() {
return money;
} public void setMoney(Double money) {
this.money = money;
} public Integer getDiningTableId() {
return diningTableId;
} public void setDiningTableId(Integer diningTableId) {
this.diningTableId = diningTableId;
} public Date getBillDate() {
return billDate;
} public void setBillDate(Date billDate) {
this.billDate = billDate;
} public String getState() {
return state;
} public void setState(String state) {
this.state = state;
}
}
3.创建BillDAO类
package com.li.mhl.dao;

import com.li.mhl.domain.Bill;

/**
* @author 李
* @version 1.0
*/
public class BillDAO extends BasicDAO<Bill>{
}
4.创建BillService类
package com.li.mhl.service;

import com.li.mhl.dao.BillDAO;

import java.util.UUID;

/**
* @author 李
* @version 1.0
* 处理和账单表bill相关的业务逻辑
*/
public class BillService {
//定义BillDAO属性
private BillDAO billDAO = new BillDAO();
//定义MenuService属性
private MenuService menuService = new MenuService();
//定义DiningTableService属性
private DiningTableService diningTableService = new DiningTableService(); //编写点餐的方法
/**
* 1.生成账单
* 2.需要更新对应的餐桌的状态
* 3.如成功返回true,失败返回false
*/
public boolean orderMenu(int menuId, int nums, int diningTableId) {
//使用UUID生成一个账单号
String billID = UUID.randomUUID().toString(); //将账单生成到bill表()
//这里的金额money = 由menuId(菜品编号)查询出来的单价 * nums
//因此,在MenuService类中编写方法getMenuById()查询菜品单价
int update = billDAO.update("insert into bill values(null,?,?,?,?,?,now(),'未结账')",
billID, menuId, nums, menuService.getMenuById(menuId).getPrice() * nums, diningTableId);
if (update <= 0) {
return false;
} //需要更新对应的餐桌的状态
//在DiningTableService类中编写方法updateDiningTableState()更新对应的餐桌的状态
return diningTableService.updateDiningTableState(diningTableId, "就餐中");
}
}
5.修改MenuService类

在该类中增加方法getMenuById()

//根据菜品id,返回Menu对象
public Menu getMenuById(int id) {
return menuDAO.querySingle("select * from menu where id=?", Menu.class, id);
}
6.修改DiningTableService类

在该类中增加方法updateDiningTableState()

//需要提供一个更新 餐桌状态的方法
public boolean updateDiningTableState(int id, String state) {
int update =
diningTableDAO.update("update diningTable set state=? where id=?", state, id);
return update > 0;
}
7.修改MHLView

修改处1:在该类中定义BillService属性

//定义BillService属性
private BillService billService = new BillService();

修改处2:在该类中增加方法

//完成点餐操作
public void orderMenu() {
System.out.println("============点餐服务============"); System.out.print("请输入点餐的桌号(-1退出): ");
int orderDiningTableId = Utility.readInt();
if (orderDiningTableId == -1) {
System.out.println("============取消点餐============");
return;
}
//验证餐桌号是否存在
DiningTable diningTableById = diningTableService.getDiningTableById(orderDiningTableId);
if (diningTableById == null) {
System.out.println("============餐桌号不存在============");
return;
} System.out.print("请输入菜品编号(-1退出): ");
int orderMenuId = Utility.readInt();
if (orderMenuId == -1) {
System.out.println("============取消点餐============");
return;
}
//验证菜品编号是否存在
Menu menuById = menuService.getMenuById(orderMenuId);
if (menuById == null) {
System.out.println("============菜品不存在============");
return;
} System.out.print("请输入菜品数量(0~99)(-1退出): ");
int orderNums = Utility.readInt();
if (orderNums == -1) {
System.out.println("============取消点餐============");
return;
}
if (orderNums <= 0) {
System.out.println("============菜品数量不能小于等于0============");
return;
} //点餐
if (billService.orderMenu(orderMenuId, orderNums, orderDiningTableId)) {
System.out.println("============点餐成功============");
} else {
System.out.println("============点餐失败============");
} }

修改处3:在二级菜单中调用该方法

4.7.4测试

  • 正常数值输入

  • 非法数值判断



测试通过

day02-显示所有菜品&点餐功能的更多相关文章

  1. ajax“显示弹窗详情”和“删除”功能练习

    1.查看详细信息,以弹窗的形式显示,使用ajax 2.批量删除 “查询”功能可以参考前面的文章,这里只讲解ajax“显示弹窗详情”和“删除”功能 第一:在body中的代码 <title>a ...

  2. 编写Java程序,应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能

    查看本章节 查看作业目录 需求说明: 应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能 实现思路: 创建 Java 项目,在项目中创建服务端类 ChatServerThre ...

  3. 如何禁用IE10的明文显示密码和快速清除功能

    IE10针对 <input>及<input type="password"> 分别提供了快速清除钮(X图标)以及密码文字显示钮(小眼睛图标)的功能: 快速清 ...

  4. 微信小程序中,如何实现显示,隐藏密码的功能

    最近在搞小程序的开发,遇到隐藏,显示密码的功能的时候,电脑上调试没问题,但是手机上面点击却没有效果,必须要跳转到其他页面再跳回来,才能正常显示. 一时间搞得我很头疼,查找资料后,终于知道了是什么原因. ...

  5. js中按钮控制显示隐藏以及下拉功能

    <script> function show() { var a2=document.getElementById("div2"); if(a2.style.displ ...

  6. 探秘IntelliJ IDEA 13测试版新功能——调试器显示本地变量

    IntelliJ IDEA在业界被公认为最好的Java开发平台之一,JetBrains公司将在12月正式发布IntelliJ IDEA 13版本. 现在,小编将和大家一起探秘密IntelliJ IDE ...

  7. .net工作流引擎ccflow开发平台属性功能的隐藏显示介绍

    关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明  工作流设计 工作流快速开发平台   业务流程管理   bpm工作流系统  java工 ...

  8. 点餐系统web版功能需求

                餐厅到店点餐系统需求分析 (版本v1.0.0)               成文信息 主题词: 需求分析 作  者: 14商软ETC 文档类别: 审  核: 批  准: 文档性 ...

  9. dr-helper项目设计介绍(一个包括移动端和Web端的点餐管理系统)

    一.源代码路径 https://github.com/weiganyi/dr-helper 二.界面 通过浏览器訪问Web服务,能够看到界面例如以下: ADT-Bundle编译project生成dr- ...

  10. java实现一个点餐系统

    转载于blog.csdn.net/weixin_44219955 项目大体框架 菜品类(菜品id,菜品名,菜品类型,上架时间,单价,月销售,总数量) 管理员类(管理员id,账号,密码) 客户类(客户i ...

随机推荐

  1. 天玑9300大战骁龙8 Gen3:十余项数据实测 到底谁才是安卓之王?

    一.前言:全大核天玑9300正面硬钢骁龙8 Gen3 究竟谁才是安卓芯片之王? 今年,两家移动芯片厂商都开始放大招了,骁龙首发Cortex-X4超大核,联发科也不甘示弱,初次将"全大核&qu ...

  2. ChatGPT 火了,一大批开源平替也来了

    ChatGPT 凭一己之力让全球为 AI 沸腾,引发了科技巨头之间的聊天机器人军备竞赛.   众所周知,ChatGPT 的背后技术是 GPT(Generative Pre-trained Transf ...

  3. 《Mastering ABP Framework》图书目录

    以下是<Mastering ABP Framework>的中文目录,目前个人正在进行翻译中,如果您对本书感兴趣,也想使用或者学习框架设计,可以访问该地址进行登记,本文只是一个目的的展示和购 ...

  4. 不同网段之间实现GDB远程调试功能

    前言 在开发过程中,使用gdb远程调试时,会碰到 Linux 服务器的网段和板载设备的网段不是一样的,不能正常使用 gbd 远程调试功能. 板载设备和电脑连接路由器,属于同一个网段,如192.168. ...

  5. 零基础入门Vue之影分身之术——列表渲染&渲染原理浅析

    听我说 从 条件渲染 那一篇,我学习到了如何用Vue对dom节点根据条件显示 但单单有条件还不够啊,有时候数据是一大坨一大坨的数据,如果Vue不提供咱要么使用"v-html" 要么 ...

  6. STC12C5A56S2和DS12C887做的电子闹铃

    配件信息 控制器: STC12C5A56S2 定时芯片: DS12C887 显示: 4位0.56寸数码管 其它: 无源蜂鸣器, 三极管S9012, 电阻10K*2, 100*1, 电容30p*2, 1 ...

  7. 神经网络优化篇:详解深度学习框架(Deep Learning frameworks)

    深度学习框架 一小点作者内心os:24年春节已过完,从熟悉的地方又回到陌生的地方谋生,愿新的一年都得偿所愿,心想事成. 学到这会儿会发现,除非应用更复杂的模型,例如卷积神经网络,或者循环神经网络,或者 ...

  8. centos7搭建postgresql主从(主备)架构

    本篇介绍如何在centos7系统搭建一个postgresql主备集群实现最近的HA(高可用)架构.后续更高级的HA模式都是基于这个最基本的主备搭建. 节点规划 ip 主机名 用途 192.168.18 ...

  9. OCP试题解析之052-- DROP PROFILE app_user

    133.You created a profile APP_USER and assigned it to the users. After a month, you decide to drop t ...

  10. Java Swing实现五子棋程序

    首先感谢08年MLDN出的这个培训视频,我把代码和文档整理了一下,发布出来给需要学习Swing的朋友. 源码地址: https://gitee.com/indexman/gobang 一.知识点准备: ...