综合实战 网上订餐系统——吃货联盟

2023-10-29 15:40

本文主要是介绍综合实战 网上订餐系统——吃货联盟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 第一章 绪论
    • 1.1 研究背景与意义
    • 1.2 基本开发技术
    • 1.3 相关技术分析
  • 第二章 需求分析
    • 2.1 主页面
    • 2.2 订单页面
    • 2.3 签收订单页面
    • 2.4 删除订单页面
    • 2.5 点赞页面
    • 2.6 订餐页面
  • 第三章 系统设计
    • 3.1 数据初始化
    • 3.2 主页面
    • 3.3 订单页面
    • 3.4 签收订单页面
    • 3.5 删除订单页面
    • 3.6 点赞页面
    • 3.7 订餐页面
  • 第四章 系统实现与测试
    • 4.1 订餐功能
    • 4.2 查看餐袋
    • 4.3 签收功能
    • 4.4 删除功能
    • 4.5 点赞功能
    • 4.6 功能测试
  • 项目源码

第一章 绪论

1.1 研究背景与意义

如今已进入网络时代,人们的日常生活已离不开网络,人们通过网络购物、看新闻、交友等。只要动动手指,就能送餐上门,网上订餐越来越受到都市年轻人的青睐。现要求开发一个网上订餐系统,需要实现“我要订餐”、“查看餐袋”、“签收订单”、“删除订单”、“我要点赞”和“退出系统”6个功能。项目运行结果如图所示。
在这里插入图片描述

1.2 基本开发技术

开发工具:IntelliJ IDEA,JDK1.8
开发语言:Java

1.3 相关技术分析

项目覆盖的技能点如下:
程序基本概念——程序、变量、数据类型。
使用顺序、选择、循环、跳转语句编写程序。
数组的使用

第二章 需求分析

2.1 主页面

在这里插入图片描述

2.2 订单页面

在这里插入图片描述

2.3 签收订单页面

在这里插入图片描述

2.4 删除订单页面

在这里插入图片描述

2.5 点赞页面

在这里插入图片描述

2.6 订餐页面

在这里插入图片描述

第三章 系统设计

3.1 数据初始化

将商品信息与订单信息定义为数组,为测试考虑暂时把订单上限设置到4个,并初始化三个商品和两个订单。

        //**********1.数据初始化*****************************************************************************************//1.1 商品信息String[] dishNames = new String[]{"红烧带鱼","鱼香肉丝","时令鲜蔬"};double[] prices = new double[]{38.0,22.5,10.0};int[] praiseNums = new int[]{0,0,0};//1.2 订单信息String[] names = new String[4];String[] dishMegs = new String[4];int[] times = new int[4];String[] addresses = new String[4];int[] states = new int[4];double[] sumPrices = new double[4];//1.3 初始化两个订单names[0] = "张晴";dishMegs[0] = "红烧带鱼两份";times[0] = 13;addresses[0] = "天成路207号";states[0] = 1;sumPrices[0] = 76.0;names[1] = "张晴";dishMegs[1] = "鱼香肉丝两份";times[1] = 13;addresses[1] = "天成路207号";states[1] = 0;sumPrices[1] = 45.0;

3.2 主页面

构造整体框架,利用do while让用户能够持续操作,再用Scanner类接受用户的输入信息,用switch case让用户能够达到各个功能页面,并记录几个关键判断初始值,如isExit、isAdd、isSignFind、isDelFind,判断用户是否退出系统、是否可以订餐、是否订单已经签收和是都已经删除。

//********2.主页面***********************************************************************************************Scanner scanner = new Scanner(System.in);int num = -1; //返回菜单标识,返回主页面/退出系统boolean isExit = false; //判断用户是否退出当前系统System.out.println("欢迎来到吃货联盟");do{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("********************");System.out.println("请选择:");//获取用户选择进入哪个页面int choise = scanner.nextInt();//1.记录是否可以订餐boolean isAdd = false;//2.定义是否已经签收的订单的状态标识;boolean isSignFind = false;//3.定义删除标识boolean isDelFind = false;//利用switch实现用户分支判断switch (choise){case 1:System.out.println("**********我要订餐**********");break;case 2:System.out.println("**********查看餐袋**********");break;case 3:System.out.println("**********签收订单**********");break;case 4:System.out.println("**********删除订单**********");break;case 5:System.out.println("**********我要点赞**********");break;case 6:isExit = true;break;default:isExit = true;break;}if(!isExit){System.out.println("输入0退出");num= scanner.nextInt();}else {break;}}while (num == 0);System.out.println("谢谢,欢迎下次光临");

3.3 订单页面

利用for循环,依次打印数组订单信息中的内容,打印时用\t(制表符)保证格式美观,并用if进行判空,空信息直接跳过,增加运行速度。

 //*******************3.订单页面************************************************************************System.out.println("序号\t订餐人\t\t餐品信息\t送餐日期\t\t送餐地址\t总金额\t订单状态");for(int i = 0;i< names.length;i++){//如果订单不为空if(names[i] != null){String stateStr = (states[i]==0)?"已预定":"已完成";System.out.println((i+1)+"\t"+names[i]+"\t\t"+dishMegs[i]+"\t"+times[i]+"\t\t" +addresses[i]+"\t"+sumPrices[i]+"\t"+stateStr);}}

3.4 签收订单页面

for循环遍历数组,当为用户输入的编号时停止,用if判断订单状态是否为“已预定”,如为是,则将状态改为“已完成”;如为“已完成”,则发出警告并返回主页面。

//*******************4.签收订单页面************************************************************************System.out.println("请选择要签收的订单序号");//获取用户输入的订单序号int signOrderId = scanner.nextInt();for(int i = 0;i< names.length;i++){if(names[i] != null && states[i] == 0 && signOrderId == i+1){//name[i] != null的含义判断如果存在数组中有订单//states[i] == 0 的含义是订单状态为已预定状态//signOrderId == i+1 如果订单列表中某个订单的号的角标+1和用户输入的序号等价//如果符合上述条件,则修改订单状态,由0置1states[i] = 1;isSignFind = true;System.out.println("签收成功");} else if (names[i] != null && states[i] == 1 && signOrderId == i+1) {//如果订单的状态为1System.out.println("您选择的订单已完成签收,不能重复签收");isSignFind = true;}}if(!isSignFind){System.out.println("您选择的订单号不存在");}

3.5 删除订单页面

依旧是for循环遍历订单信息,当订单信息编号与用户输入的一致且订单状态为“已完成”时,删除该信息,将数组后面的信息前移一位,并将数组中最后一位信息置空;如果输入不存在的订单或订单状态为“已预定”,则无法删除订单,弹出警告并返回主页面。

 //*******************5.删除订单页面************************************************************************System.out.println("请输入要删除的订单");int delId = scanner.nextInt();for(int i = 0;i<names.length;i++){if(names[i] != null && states[i] == 1 && delId == i+1){//条件1:存在该订单 条件2:订单状态已完成 条件3:输入的订单号存在于当前订单数据中isDelFind = true;//某个订单删除后,后面的订单统一向前移一位for(int j = delId-1;j< names.length-1;j++){names[j] = names[j+1];dishMegs[j] = dishMegs[j+1];times[j] = times[j+1];addresses[j] = addresses[j+1];states[j] = states[j+1];sumPrices[j] = sumPrices[j+1];}//最后一位清空names[names.length-1] = null;dishMegs[names.length-1] = null;times[names.length-1] = 0;addresses[names.length-1] = null;states[names.length-1] = 0;sumPrices[names.length-1] = 0;System.out.println("删除订单成功");break;} else if (names[i] != null && states[i] == 0 && delId == i+1) {System.out.println("该订单已预定,不能删除");isDelFind = true;break;}}if(!isDelFind){System.out.println("您选择的订单不存在");}

3.6 点赞页面

首先先利用for循环遍历商品信息,将其打印在控制台上,然后根据用户输入的菜品序号为其点赞数加一。

  //*******************6.点赞页面************************************************************************System.out.println("序号\t菜名\t\t单价\t\t点赞数");for(int i = 0;i< dishNames.length;i++){System.out.println((i+1)+"\t"+dishNames[i]+"\t"+prices[i]+"\t"+praiseNums[i]);}System.out.println("请输入你要点赞的菜品序号:");int praiseNum = scanner.nextInt();if(praiseNum <= 0 || praiseNum> dishNames.length){System.out.println("您输入的菜品不存在");}else {praiseNums[praiseNum-1]++;System.out.println("点赞成功");}

3.7 订餐页面

先用for循环遍历订单信息,如果订单信息还有空位置则可以继续进行订餐,否则弹出警告。依次让用户输入“订餐人姓名”、“菜品编号”、“菜品数量”、“送餐时间”和“送餐地址”,接着打印用户本次订餐的信息,并将信息添加到数组当中。

 //*******************7.订餐页面************************************************************************for(int i = 0;i< names.length;i++){if(names[i] == null){isAdd = true;System.out.println("请输入订餐人姓名");String name = scanner.next();System.out.println("序号\t菜名\t单价\t点赞数");for(int j = 0;j< dishNames.length;j++){System.out.println((j+1)+"\t"+dishNames[j]+"\t"+prices[j]+"\t"+praiseNums[j]);}//用户点菜System.out.println("请输入点的菜的编号");int chooseDish = scanner.nextInt();System.out.println("请输入需要的份数");int number = scanner.nextInt();String dishMeg = dishNames[chooseDish-1]+number+"份";//菜品总价格double sumPrice = prices[chooseDish-1] * number;//运送费double deliCharget = sumPrice>50?0:6;System.out.println("请输入送餐时间(送餐时间为10点到20点整):");//送餐时间int time = scanner.nextInt();if(time<10 || time>20){System.out.println("您的输入有误,请输入10-20之间的整数");time = scanner.nextInt();}System.out.println("请输入运送地址");//运送地址String address = scanner.next();//打印订餐信息System.out.println("*******订餐成功*******");System.out.println("您订购的是"+dishMeg);System.out.println("运送时间为"+time+"点");System.out.println("餐费"+sumPrice);System.out.println("运送费"+deliCharget);System.out.println("总价格"+(sumPrice+deliCharget));//添加信息到数组中names[i] = name;dishMegs[i] = dishMeg;times[i] = time;addresses[i] = address;states[i] = 0;sumPrices[i] = sumPrice+deliCharget;break;}}if(!isAdd){System.out.println("对不起,您的购物车已满");}

第四章 系统实现与测试

4.1 订餐功能

输入1进入订餐页面,依次输入订餐人姓名、点的菜的编号、点的菜的数量、送餐时间和送餐地址,系统将自动打印本次订餐信息。
在这里插入图片描述
在这里插入图片描述

4.2 查看餐袋

输入2进入查看餐袋页面,系统将显示您所有的订餐信息。
在这里插入图片描述

4.3 签收功能

输入3进入签收订单页面,再输入需要签收的订单,系统将输出“签收成功“。
在这里插入图片描述

4.4 删除功能

输入4进入删除订单页面,再输入需要删除的订单,系统将输出“删除订单成功“。
在这里插入图片描述

4.5 点赞功能

输入5进入我要点赞页面,系统会打印所有的菜品信息,输入你想要点赞的菜品的序号,系统将输出“点赞成功“。

4.6 功能测试

功能模块测试用例预期结果测试结果
主页面输入正确的页面序号跳转到响应的功能模块通过
主页面输入错误的页面序号退出系统通过
订餐功能输入合法的订餐信息订餐成功并打印信息通过
订餐功能输入不合法的菜的编号示意用户并重新输入通过
订餐功能输入不合法的菜的数量示意用户并重新输入通过
订餐功能输入不合法的订餐时间示意用户并重新输入通过
订餐功能再次输入不合法的订餐时间示意用户并重新输入通过
查看餐袋进入查看餐袋页面显示所有订单信息通过
签收订单输入已预定的订单编号签收成功并将订单状态改为已完成通过
签收订单输入已完成的订单编号弹出警告并返回主页面通过
签收订单输入不存在的订单编号弹出警告并返回主页面通过
删除订单输入已完成的订单编号删除成功并将后续所有信息前移一位通过
删除订单输入已预定的订单编号弹出警告并返回主页面通过
删除订单输入不存在的订单编号弹出警告并返回主页面通过
点赞功能输入存在的菜的编号点赞成功并且该菜点赞数加已通过
点赞功能输入不存在的菜的编号点赞失败并且弹出警告通过
退出功能返回主页时输入正确的字符成功返回主页通过
退出功能返回主页时输入错误的字符退出系统通过

项目源码

源码下载地址

这篇关于综合实战 网上订餐系统——吃货联盟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301636

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重