满汉楼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. Git企业开发控制理论和实操-从入门到深入(三)|分支管理

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  2. ASP.NET Core分布式项目实战(Consent 代码重构)--学习笔记

    任务23:Consent 代码重构 新建一个 Sercices 文件夹,在文件夹下新建一个 ConsentService,专门用于处理 Consent 的逻辑,我们会把 controller 中不是 ...

  3. 浅谈高维FWT

    概述 快速沃尔什变换,可以用来处理有关异或卷积的问题. 而异或运算,也就是二进制下的不进位加法运算,我们考虑能否将其拓展到高维. 也就是,在 \(k\) 进制下的不进位加法卷积. 对于具体的某一位,我 ...

  4. Linux证书问题:curl#60 - “The certificate issuer‘s certificate has expired

    问题说明 最近在centos7上打算安装php7版本,需要下载一个外网https的yum源,结果报错如下: 执行命令 rpm -Uvh https://mirror.webtatic.com/yum/ ...

  5. wsl 配置ubuntu apt源为阿里源

    $ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak $ sudo sed -i 's/security.ubuntu/mirrors.a ...

  6. win32-ReadProcessMemory 的使用

    std::vector<std::byte> ReadBytes(PVOID address, SIZE_T length) { std::vector<std::byte> ...

  7. Qt三方库开发技术:QXlsx介绍、编译和使用

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. django中的Case,When,then用法

    # 参考文档 https://docs.djangoproject.com/en/2.2/ref/models/conditional-expressions/ # Case()接受任意数量的When ...

  9. Retrofit 的基本用法

    一.添加依赖和网络权限 添加依赖 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup ...

  10. 【LeetCode二叉树#09】路径总和I+II,以及求根节点到叶节点数字之和(回溯回溯,还是™的回溯)

    路径总和 力扣题目链接(opens new window) 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的 ...