0
点赞
收藏
分享

微信扫一扫

29、Java——吃货联盟订餐系统(对象+XML)

目录

​​⛳️项目需求​​

​​⛳️项目环境准备​​

​​⛳️案例覆盖的技能点​​

​​⛳️难点分析​​

​​    ❤️1、使用XML保存订单信息​​

​​    ❤️2、我要订餐”方法:存储到XML文件里​​

​​    ❤️3、删除订单信息​​

​​⛳️项目实现思路 ​​

​​    ❤️1、 数据初始化​​

​​    ❤️2、 实现菜单切换​​

​​    ❤️3、 实现查看餐袋​​

​​    ❤️4、 实现我要订餐​​

​​    ❤️5、 实现签收订单​​

​​    ❤️6、 实现删除订单​​

​​    ❤️7、 实现我要点赞​​

​​⛳️代码展示​​

​​    ❤️1、操作方法:OrderMethod类​​

​​    ❤️4、订餐系统:OrderSystem类​​

​​ ⛳️效果展示​​

29、Java——吃货联盟订餐系统(对象+XML)_开发语言

⛳️项目需求

    (1)现今已经进入网络时代,人们的日常生活已经离不开网络,如网上购物、看新闻、交友等。
    (2)“只要点点手指,就能送餐上门”,网上订餐越来越受到都市年轻人的青睐。
    (3)现要求开发一个网上订餐系统,需要实现我要订餐、查看餐袋、签收订单、删除订单、我要点赞和退出系统6个功能。

⛳️项目环境准备

    (1)开发工具:MyEclipse,JDK1.7。
    (2)开发语言:Java。

⛳️案例覆盖的技能点

    (1)理解程序基本概念——程序、变量、数据类型。
    (2)会使用顺序、选择、循环、跳转语句编写程序。
    (3)掌握类、对象、方法、File类等相关知识。
    (4)DOM解析XML

⛳️难点分析

   ❤️1、使用XML保存订单信息

        (1)初始化order.xml文件里的订单信息

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Orders>
<Order address="天成路207号" dishMeg="红烧带鱼 2份" name="张三" state="1"
sumPrices="76.0" time="12" />
<Order address="天成路207号" dishMeg="鱼香肉丝 2份" name="李四" state="1"
sumPrices="45.0" time="12" />
<Order address="fsagghh" dishMeg=" 2份" name="huangh" state="0"
sumPrices="76.0" time="14" />
</Orders>

        (2)初始化food.xml文件里的菜单信息

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Foods>
<Food disName="红烧带鱼" price="38.0" praiseNum="0" />
<Food disName="鱼香肉丝" price="20.0" praiseNum="0" />
<Food disName="时令鲜蔬" price="10.0" praiseNum="0" />
</Foods>

        (3)在测试类中定义File对象,并获取Document对象

File file1 = new File("order.xml");
//获取Document对象
OrderMethod.getOrderDocument(file1);

        (4)声明方法获得Order和Food的Document对象;编写保存Order的XML的方法

// 声明方法获得Order的Document对象
public static void getOrderDocument(File file) {
// 获取解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document对象,即DOM树
documentOrder = db.parse(file);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

// 声明方法获得Food的Document对象
public static void getFoodDocument(File file) {
// 获取解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document对象,即DOM树
documentFood = db.parse(file);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

// 声明保存Order的XML的方法
public static void saveXml(String url) {
// 保存XML文件
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer;
try {
transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(documentOrder);
// 设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(new FileOutputStream(url));
// 把DOM转换为XML文件
transformer.transform(domSource, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

    ❤️2、我要订餐”方法:存储到XML文件里

public static void myOrder() {
System.out.println("--新增订单--");
// (1)订餐人姓名
System.out.println("请输入订餐人姓名:");
String orderName = input.next();

// (2)选择菜品及份数
String foodInfo = lookFood();
String dishMeg = foodInfo.split(",")[0];

// (3)送餐时间
System.out.println("请选择送餐时间(10:00-20:00整点送餐):");
int orderTime = input.nextInt();
while (orderTime < 10 || orderTime > 20) {
System.out.println("输入错误,请重新输入:");
orderTime = input.nextInt();
}

// (4)送餐地址
System.out.println("请输入送餐地址:");
String orderAddress = input.next();

// (6)总金额 = 菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。
double caiPrices = Double.valueOf(foodInfo.split(",")[1]);
if (caiPrices < 50) {
caiPrices = caiPrices + 5;
}

// 将订餐数据添加到order.xml中
// 创建Order节点
Element brandElement = documentOrder.createElement("Order");
brandElement.setAttribute("name", orderName);
brandElement.setAttribute("dishMeg", dishMeg);
brandElement.setAttribute("time", orderTime + "");
brandElement.setAttribute("address", orderAddress);
brandElement.setAttribute("state", "0");
brandElement.setAttribute("sumPrices", caiPrices + "");
Element orderElement = (Element) documentOrder.getElementsByTagName("Orders").item(0);
orderElement.appendChild(brandElement);
// 保存
saveXml("order.xml");
}

    ❤️3、删除订单信息

        NodeList nl = documentOrder.getElementsByTagName("Order");
        for (int i = 0; i < nl.getLength(); i++) {
            // 将节点集合中的元素取出来
            Element order = (Element) nl.item(i);
            if (orderNum1 == i + 1) {
                if (order.getAttribute("name") != null) {
                    if (order.getAttribute("state").equals("0")) {
                        System.out.println("该订单仍在预定状态,不能删除!");
                    } else {
                        order.getParentNode().removeChild(order);
                        System.out.println("订单删除成功!");
                    }
                }
            }
        }

⛳️项目实现思路 

   ❤️1、 数据初始化

(1)创建方法类:OrderMgr类
                // 我要订餐
                OrderMethod.myOrder();
                // 查看餐袋
                OrderMethod.lookOrder();
                // 签收订单
                OrderMethod.signOrder();
                // 删除订单
                OrderMethod.delOrder();
                // 我要点赞
                OrderMethod.myLike();

(2)创建测试类:Test

    ❤️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、操作方法:OrderMethod类

package cn.bdqn.demo01;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class OrderMethod {
static Scanner input = new Scanner(System.in);
static Document documentOrder;
static Document documentFood;

// 定义一个欢迎菜单方法
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("-------------------------");
}

// 声明方法获得Order的Document对象
public static void getOrderDocument(File file) {
// 获取解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document对象,即DOM树
documentOrder = db.parse(file);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

// 声明方法获得Food的Document对象
public static void getFoodDocument(File file) {
// 获取解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document对象,即DOM树
documentFood = db.parse(file);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

// 声明保存Order的XML的方法
public static void saveXml(String url) {
// 保存XML文件
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer;
try {
transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(documentOrder);
// 设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(new FileOutputStream(url));
// 把DOM转换为XML文件
transformer.transform(domSource, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

// (1.1)查看订单方法:从order.xml文件中的读取全部订单信息
public static void lookOrder() {
System.out.println("--查看餐袋--");
System.out
.println("序号\t\t订餐人\t\t餐品信息\t\t\t送餐时间\t\t送餐地址\t\t\t总金额\t\t订单状态");
NodeList nl = documentOrder.getElementsByTagName("Order");
for (int i = 0; i < nl.getLength(); i++) {
// 将节点集合中的元素取出来
Element order = (Element) nl.item(i);
if (order != null) {
String time = order.getAttribute("time") + "点";
String sumPrice = order.getAttribute("sumPrices") + "元";
String state;
if (order.getAttribute("state").equals("0")) {
state = "已预订";
} else {
state = "已完成";
}
System.out.println((i + 1) + "\t\t"
+ order.getAttribute("name") + "\t\t"
+ order.getAttribute("dishMeg") + "\t\t" + time
+ "\t\t" + order.getAttribute("address") + "\t\t"
+ sumPrice + "\t\t" + state);
}
}
}

// (1.2)查看菜单方法:从food.xml文件中的读取全部订单信息
public static String lookFood() {
String dishFen = "";
System.out.println("序号\t名称\t\t单价\t点赞数");
NodeList nl = documentFood.getElementsByTagName("Food");
for (int i = 0; i < nl.getLength(); i++) {
Element food = (Element) nl.item(i);
if (food != null) {
String numStr = (i + 1) + "";
String disName = food.getAttribute("disName");
Double price = Double.valueOf(food.getAttribute("price"));
int praiseNum = Integer.valueOf(food.getAttribute("praiseNum"));
System.out.println(numStr + "\t" + disName + "\t\t" + price
+ "\t" + praiseNum);
}
}
System.out.println("请选择菜品序号:");
int caiNum = input.nextInt();
System.out.println("选择份数:");
int fenNum = input.nextInt();
for (int i = 0; i < nl.getLength(); i++) {
Element food = (Element) nl.item(i);
if (i == (caiNum - 1)) {
String disName = food.getAttribute("diaName");
Double price = Double.valueOf(food.getAttribute("price"));

dishFen = disName + " " + fenNum + "份" + "," + (price * fenNum);
}
}

return dishFen;
}

// (2)“我要订餐”方法:存储到XML文件里
public static void myOrder() {
System.out.println("--新增订单--");
// (1)订餐人姓名
System.out.println("请输入订餐人姓名:");
String orderName = input.next();

// (2)选择菜品及份数
String foodInfo = lookFood();
String dishMeg = foodInfo.split(",")[0];

// (3)送餐时间
System.out.println("请选择送餐时间(10:00-20:00整点送餐):");
int orderTime = input.nextInt();
while (orderTime < 10 || orderTime > 20) {
System.out.println("输入错误,请重新输入:");
orderTime = input.nextInt();
}

// (4)送餐地址
System.out.println("请输入送餐地址:");
String orderAddress = input.next();

// (6)总金额 = 菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。
double caiPrices = Double.valueOf(foodInfo.split(",")[1]);
if (caiPrices < 50) {
caiPrices = caiPrices + 5;
}

// 将订餐数据添加到order.xml中
// 创建Order节点
Element brandElement = documentOrder.createElement("Order");
brandElement.setAttribute("name", orderName);
brandElement.setAttribute("dishMeg", dishMeg);
brandElement.setAttribute("time", orderTime + "");
brandElement.setAttribute("address", orderAddress);
brandElement.setAttribute("state", "0");
brandElement.setAttribute("sumPrices", caiPrices + "");
Element orderElement = (Element) documentOrder.getElementsByTagName("Orders").item(0);
orderElement.appendChild(brandElement);
// 保存
saveXml("order.xml");
}

// (3)“签收订单”的方法
public static void signOrder() {
System.out.println("--签收订单--");
System.out.println("请选择需要签收的订单序号:");
int orderNum = input.nextInt();
NodeList nl = documentOrder.getElementsByTagName("Order");
for (int i = 0; i < nl.getLength(); i++) {
// 将节点集合中的元素取出来
Element order = (Element) nl.item(i);
if (orderNum == i + 1) {
if (order.getAttribute("name") != null) {
if (order.getAttribute("state").equals("0")) {
order.setAttribute("state", "1");
System.out.println("订单签收完成!");
} else {
System.out.println("你选择的订单已完成,不能再次签收订单!");
}
}
}
}
// 保存
saveXml("order.xml");
}

// (4)“删除订单”的方法
public static void delOrder() {
System.out.println("--删除订单--");
System.out.println("请选择需要删除的订单序号:");
int orderNum1 = input.nextInt();
NodeList nl = documentOrder.getElementsByTagName("Order");
for (int i = 0; i < nl.getLength(); i++) {
// 将节点集合中的元素取出来
Element order = (Element) nl.item(i);
if (orderNum1 == i + 1) {
if (order.getAttribute("name") != null) {
if (order.getAttribute("state").equals("0")) {
System.out.println("该订单仍在预定状态,不能删除!");
} else {
order.getParentNode().removeChild(order);
System.out.println("订单删除成功!");
}
}
}
}
// 保存
saveXml("order.xml");
}

// (5)“我要点赞”的方法
public static void myLike() {
System.out.println("--我要点赞--");
System.out.println("序号\t名称\t\t单价\t点赞数");
NodeList nl = documentFood.getElementsByTagName("Food");
for (int i = 0; i < nl.getLength(); i++) {
Element food = (Element) nl.item(i);
if (food != null) {
String numStr = (i + 1) + "";
String disName = food.getAttribute("disName");
Double price = Double.valueOf(food.getAttribute("price"));
int praiseNum = Integer.valueOf(food.getAttribute("praiseNum"));
System.out.println(numStr + "\t" + disName + "\t\t" + price
+ "\t" + praiseNum);
}
}
System.out.println("请选择点赞的菜品序号:");
int caiZanNum = input.nextInt();

for (int i = 0; i < nl.getLength(); i++) {
Element food = (Element) nl.item(i);
if (caiZanNum == i + 1) {
int currentPraise=Integer.valueOf(food.getAttribute("praiseNum"));
currentPraise++;
food.setAttribute("praiseNum", currentPraise+"");
}
}
// 保存
saveXml("food.xml");

System.out.println("点赞后的菜品展示:");
System.out.println("序号\t名称\t\t单价\t点赞数");
for (int i = 0; i < nl.getLength(); i++) {
Element food = (Element) nl.item(i);
if (food != null) {
String numStr = (i + 1) + "";
String disName = food.getAttribute("disName");
Double price = Double.valueOf(food.getAttribute("price"));
int praiseNum = Integer.valueOf(food.getAttribute("praiseNum"));
System.out.println(numStr + "\t" + disName + "\t\t" + price
+ "\t" + praiseNum);
}
}
}

}

    ❤️4、订餐系统:OrderSystem类

package cn.bdqn.demo01;

import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;

public class OrderSystem {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

// 默认初始值
boolean flag = true;
// 循环初始值
int num = -1;

File file1 = new File("order.xml");
//获取Document对象
OrderMethod.getOrderDocument(file1);
File file2 = new File("food.xml");
//获取Document对象
OrderMethod.getFoodDocument(file2);
do {
//欢迎菜单
OrderMethod.showOrder();
System.out.println("请选择:");
int choose = input.nextInt();
switch (choose) {
case 1:
// 我要订餐
OrderMethod.myOrder();
break;
case 2:
// 查看餐袋
OrderMethod.lookOrder();
break;
case 3:
// 签收订单
OrderMethod.signOrder();
break;
case 4:
// 删除订单
OrderMethod.delOrder();
break;
case 5:
// 我要点赞
OrderMethod.myLike();
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("谢谢使用,欢迎下次光临");
}
}

 ⛳️效果展示

29、Java——吃货联盟订餐系统(对象+XML)_开发语言_02

 


举报

相关推荐

0 条评论