⛳️项目需求
(1)现今已经进入网络时代,人们的日常生活已经离不开网络,如网上购物、看新闻、交友等。
(2)“只要点点手指,就能送餐上门”,网上订餐越来越受到都市年轻人的青睐。
(3)现要求开发一个网上订餐系统,需要实现我要订餐、查看餐袋、签收订单、删除订单、我要点赞和退出系统6个功能。
⛳️项目环境准备
(1)开发工具:MyEclipse,JDK1.7。
(2)开发语言:Java。
⛳️案例覆盖的技能点
(1)理解程序基本概念——程序、变量、数据类型。
(2)会使用顺序、选择、循环、跳转语句编写程序。
(3)会使用集合。
(4)了解类、对象、方法、私有变量等相关知识。
⛳️难点分析
❤️1、 使用集合保存订单信息
(1)根据本项目的需求分析可知,每条订单的信息都包括订餐人姓名、选择菜品及份数、送餐时间、送餐地址、订单状态、总金额,并且会有多条订单信息,可以定义一个Order类,在Order类中将订单的各个信息设置为私有属性,再添加这些属性的有参构造方法以及Get/Set方法。
private String name; private String dishMeg; private int time; private String address; private int state; private double sumPrices; public Order() { super(); } public Order(String name, String dishMeg, int time, String address, int state, double sumPrices) { super(); this.name = name; this.dishMeg = dishMeg; this.time = time; this.address = address; this.state = state; this.sumPrices = sumPrices; } //添加私有变量的Get/Set方法
(2)定义一个两个集合
// 初始化Order集合 ArrayList orders=new ArrayList(); // 初始化Food集合 ArrayList foods = new ArrayList();
(3)初始化数据,并存入两个集合中;
// 初始化两条订单Order信息,并存入集合中 Order od1= new Order("张三", "红烧带鱼 2份", 12, "天成路207号", 1, 76.0); Order od2= new Order("李四", "鱼香肉丝 2份", 12, "天成路207号", 0, 45.0); orders.add(od1); orders.add(od2); // 供选择的菜品信息 Food fd1 = new Food("红烧带鱼", 38.0, 0); Food fd2 = new Food("鱼香肉丝", 20.0, 0); Food fd3 = new Food("时令鲜蔬", 10.0, 0); foods.add(fd1); foods.add(fd2); foods.add(fd3);
❤️2、访问订单信息
访问 ArrayList集合中第i+1条订单信息可采用如下方式
订餐人姓名:orders.get(i).getName()
所选菜品信息:orders.get(i).getDishMeg()
送餐时间:orders.get(i).getTime()
送餐地址:orders.get(i).getAddress()
订单状态:orders.get(i).getState()
订单的总金额:orders.get(i).getSumPrices()
❤️3、 删除订单信息
直接用orders.remove(i);
❤️4、 计算订单的总金额
// 总金额 =菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。
// (6)总金额 = 菜品单价*份数+送餐费。 // 其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。 double caiPrices = foods.get(caiNum - 1).getPrice() * fenNum; if (caiPrices < 50) { caiPrices = caiPrices + 5; // orders[i].setSumPrices(caiPrices); }
⛳️项目实现思路
❤️1、 数据初始化
(1)创建订单类:Order类
订单属性信息有(加private封装):订餐人姓名(name)、选择菜品信息(dishMeg)、送餐时间(time)、送餐地址(address)、订单状态(state)、总金额(sumPrices)。
(2)创建菜品类:Food类
订单属性信息有(加private封装):菜品名称(disName)、菜品单价(price)、点赞数(praiseNum)。
(3)创建方法类:OrderMethod类
// 我要订餐 OrderMethod.myOrder(orders, foods); // 查看餐袋 OrderMethod.lookOrder(orders); // 签收订单 OrderMethod.signOrder(orders); // 删除订单 OrderMethod.delOrder(orders); // 我要点赞 OrderMethod.myLike(orders, foods);
(4)创建测试类:OrderSystem
❤️2、 实现菜单切换
执行程序,输出系统主菜单。用户根据显示的主菜单,输入功能编号实现菜单的显示和菜单的切换,具体要求如下:
(1)当输入1~5时,输出相关的菜单项信息。
(2)显示“输入0返回”。输入0,则返回主菜单,否则,退出系统,终止程序的运行,输出提示信息“谢谢使用,欢迎下次光临!”。
❤️3、 实现查看餐袋
遍历系统中已有的订单,并逐条显示输出,内容包括序号、订餐人姓名、订餐信息(菜品名和份数)、送餐时间、送餐地址、总金额、订单状态(已预订或已完成)。
❤️4、 实现我要订餐
为用户显示系统中提供的菜品信息,获得订餐人信息,形成订单。每条订单包含如下信息。
(1)订餐人姓名:要求用户输入。
(2)选择菜品及份数:显示3个供选择菜品的序号、名称、单价、点赞数,提示用户输入要选择的菜品序号及份数。
(3)送餐时间:当天10:00~20:00间整点送餐,要求用户输入10~20的整数,输入错误,重新输入。
(4)送餐地址:要求用户输入。
(5)状态:订单的当前状态。订单有两种状态,0为已预订状态(默认状态),1为已完成(订单已签收)。
(6)总金额:订单总金额。总金额 = 菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。
各数组中相同下标的数据组成一条订单信息,因此向每个数组相同下标的位置各增加一条数据并保存。
❤️5、 实现签收订单
送餐完成后,要将用户签收订单的状态由“已预订”修改为“已完成”。业务要求如下:
(1)如果订单的当前状态为:“已预订”且数组下标为用户输入的订单序号减1,就签收。
(2)如果订单的当前状态为:“已完成”且数组下标为用户输入的订单序号减1,不可签收。
控制台接收要签收的订单序号。利用for循环结构遍历全部订单,利用if选择结构判断names数组中订餐人姓名是否为null,订单状态是否为已预订且数组下标是指定订单序号减1。
如果条件成立,该订单的状态值修改为1(即已完成)。
❤️6、 实现删除订单
❤️7、 实现我要点赞
选择执行“我要点赞”菜单项。
(1)界面显示菜品序号、菜品名、单价、点赞数(如为0可不显示),提示用户输入要点赞的菜品序号。
(2)接收要点赞的菜品序号。
(3)praiseNums中对应菜品的点赞数加1。
⛳️代码展示
❤️1、订单信息:
Order类(全部代码)
package cn.bdqn.demo01; //定义一个订单类 public class Order { //定义订单类属性 private String name; private String dishMeg; private int time; private String address; private int state; private double sumPrices; //定义订单类无参构造 public Order() { super(); } //定义订单类有参构造 public Order(String name, String dishMeg, int time, String address, int state, double sumPrices) { super(); this.name = name; this.dishMeg = dishMeg; this.time = time; this.address = address; this.state = state; this.sumPrices = sumPrices; } //定义订单类get/set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDishMeg() { return dishMeg; } public void setDishMeg(String dishMeg) { this.dishMeg = dishMeg; } public int getTime() { return time; } public void setTime(int time) { this.time = time; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getState() { return state; } public void setState(int state) { this.state = state; } public double getSumPrices() { return sumPrices; } public void setSumPrices(double sumPrices) { this.sumPrices = sumPrices; } }
❤️2、菜品:Food类
逻辑部分参照吃货联盟订餐系统的逻辑改写即可
package cn.bdqn.demo01; import java.util.Scanner; //定义菜品类 public class Food { static Scanner input = new Scanner(System.in); //定义菜品类属性 private String disName; private double price; private int praiseNum; //定义菜品类无参构造 public Food() { super(); } //定义菜品类有参构造 public Food(String disName, double price, int praiseNum) { super(); this.disName = disName; this.price = price; this.praiseNum = praiseNum; } //定义菜品类get/set方法 public String getDisName() { return disName; } public void setDisName(String disName) { this.disName = disName; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPraiseNum() { return praiseNum; } public void setPraiseNum(int praiseNum) { this.praiseNum = praiseNum; } }
❤️3、操作方法:OrderMethod类
package cn.bdqn.demo01; import java.util.ArrayList; import java.util.Scanner; public class OrderMethod { static Scanner input = new Scanner(System.in); // 定义一个欢迎菜单方法 public static void showOrder() { // 输出欢迎菜单 System.out.println("欢迎使用吃货联盟订餐系统"); System.out.println("-------------------------"); System.out.println("1.我要订餐"); System.out.println("2.查看餐带"); System.out.println("3.签收订单"); System.out.println("4.删除订单"); System.out.println("5.我要点赞"); System.out.println("6.退出系统"); System.out.println("-------------------------"); } // 定义一个“我要订餐”的方法 public static void myOrder(ArrayList orders, ArrayList foods) { for (int i = 0; i < orders.size(); i++) { System.out.println("--新增订单--"); // (1)订餐人姓名 System.out.println("请输入订餐人姓名:"); String orderName = input.next(); // orders[i].setName(orderName); // (2)选择菜品及份数 System.out.println("序号\t名称\t\t单价\t点赞数"); for (int j = 0; j < foods.size(); j++) { System.out.println((j + 1) + "\t" + foods.get(j).getDisName() + "\t\t" + foods.get(j).getPrice() + "\t" + foods.get(j).getPraiseNum()); } System.out.println("请选择菜品序号:"); int caiNum = input.nextInt(); System.out.println("选择份数:"); int fenNum = input.nextInt(); String dishFen = foods.get(caiNum - 1).getDisName() + " " + fenNum + "份"; // (3)送餐时间 System.out.println("请选择送餐时间(10:00-20:00整点送餐):"); int orderTime = input.nextInt(); while (orderTime < 10 || orderTime > 20) { System.out.println("输入错误,请重新输入:"); orderTime = input.nextInt(); // orders[i].setTime(input.nextInt()); } // (4)送餐地址 System.out.println("请输入送餐地址:"); String orderAddress = input.next(); // orders[i].setAddress(input.next()); // (5)状态(新增时,订单状态均为默认状态0) // orders[i].setState(0); // (6)总金额 = // 菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。 double caiPrices = foods.get(caiNum - 1).getPrice() * fenNum; if (caiPrices < 50) { caiPrices = caiPrices + 5; // orders[i].setSumPrices(caiPrices); } // 将订餐数据添加到order数组中 Order od = new Order(orderName, dishFen, orderTime, orderAddress, 0, caiPrices); orders.add(od); break; } } // 定义一个“查看餐袋”的方法 public static void lookOrder(ArrayList orders) { System.out.println("--查看餐袋--"); System.out .println("序号\t\t订餐人\t\t餐品信息\t\t\t送餐时间\t\t送餐地址\t\t\t总金额\t\t订单状态"); for (int i = 0; i < orders.size(); i++) { if (orders.get(i) != null) { String time = orders.get(i).getTime() + "点"; String sumPrice = orders.get(i).getSumPrices() + "元"; String state; if (orders.get(i).getState() == 0) { state = "已预订"; } else { state = "已完成"; } System.out.println((i + 1) + "\t\t" + orders.get(i).getName() + "\t\t" + orders.get(i).getDishMeg() + "\t\t" + time + "\t\t" + orders.get(i).getAddress() + "\t\t" + sumPrice + "\t\t" + state); } } } // 定义一个“签收订单”的方法 public static void signOrder(ArrayList orders) { System.out.println("--签收订单--"); System.out.println("请选择需要签收的订单序号:"); int orderNum = input.nextInt(); for (int i = 0; i < orders.size(); i++) { if (orderNum == i + 1) { if (orders.get(i) != null) { if (orders.get(i).getState() == 0) { orders.get(i).setState(1); System.out.println("订单签收完成!"); } else { System.out.println("你选择的订单已完成,不能再次签收订单!"); } } } } } // 定义一个“删除订单”的方法 public static void delOrder(ArrayList orders) { System.out.println("--删除订单--"); System.out.println("请选择需要删除的订单序号:"); int orderNum1 = input.nextInt(); for (int i = 0; i < orders.size(); i++) { if (orderNum1 == i + 1) { if (orders.get(i)!= null) { if (orders.get(i).getState() == 0) { System.out.println("该订单仍在预定状态,不能删除!"); break; } else { orders.remove(i); System.out.println("订单删除成功!"); } } } } } // 定义一个“我要点赞”的方法 public static void myLike(ArrayList orders, ArrayList foods) { System.out.println("--我要点赞--"); System.out.println("序号\t名称\t\t单价\t点赞数"); for (int j = 0; j < foods.size(); j++) { System.out.println((j + 1) + "\t" + foods.get(j).getDisName() + "\t\t" + foods.get(j).getPrice() + "\t" + foods.get(j).getPraiseNum()); } System.out.println("请选择点赞的菜品序号:"); int caiZanNum = input.nextInt(); for (int j = 0; j < foods.size(); j++) { if (caiZanNum == j + 1) { foods.get(j).setPraiseNum(foods.get(j).getPraiseNum() + 1); } } System.out.println("点赞后的菜品展示:"); System.out.println("序号\t名称\t\t单价\t点赞数"); for (int j = 0; j < foods.size(); j++) { System.out.println((j + 1) + "\t" + foods.get(j).getDisName() + "\t\t" + foods.get(j).getPrice() + "\t" + foods.get(j).getPraiseNum()); } } }
❤️4、订餐系统:OrderSystem类
package cn.bdqn.demo01; import java.util.ArrayList; import java.util.Scanner; public class OrderSystem { public static void main(String[] args) { Scanner input = new Scanner(System.in); // 初始化Order集合 ArrayList orders=new ArrayList(); // 初始化Food集合 ArrayList foods = new ArrayList(); // 初始化两条订单Order信息,并存入集合中 Order od1= new Order("张三", "红烧带鱼 2份", 12, "天成路207号", 1, 76.0); Order od2= new Order("李四", "鱼香肉丝 2份", 12, "天成路207号", 0, 45.0); orders.add(od1); orders.add(od2); // 供选择的菜品信息 Food fd1 = new Food("红烧带鱼", 38.0, 0); Food fd2 = new Food("鱼香肉丝", 20.0, 0); Food fd3 = new Food("时令鲜蔬", 10.0, 0); foods.add(fd1); foods.add(fd2); foods.add(fd3); // 默认初始值 boolean flag = true; // 循环初始值 int num = -1; do { //欢迎菜单 OrderMethod.showOrder(); System.out.println("请选择:"); int choose = input.nextInt(); switch (choose) { case 1: // 我要订餐 OrderMethod.myOrder(orders, foods); break; case 2: // 查看餐袋 OrderMethod.lookOrder(orders); break; case 3: // 签收订单 OrderMethod.signOrder(orders); break; case 4: // 删除订单 OrderMethod.delOrder(orders); break; case 5: // 我要点赞 OrderMethod.myLike(orders, foods); break; case 6: // 退出系统 flag = false; break; default: flag = false; break; } if (flag) { System.out.println("输入0返回:"); num = input.nextInt(); } else { break; } } while (num == 0); System.out.println("谢谢使用,欢迎下次光临"); } }