当前位置: 首页 > news >正文

【韩顺平 Java满汉楼项目 控制台版】MySQL+JDBC+druid

文章目录

  • 功能
  • 界面
    • 用户登录界面
    • 显示餐桌状态
    • 预定
    • 显示所有菜品
    • 点餐
    • 查看账单
    • 结账
    • 退出满汉楼
  • 程序框架图
  • 项目依赖
  • 项目结构
  • 方法调用图
  • 功能实现
    • 登录
    • 显示餐桌状态
    • 订座
    • 显示所有菜品
    • 点餐
    • 查看账单
    • 结账
    • 退出满汉楼
  • 扩展思考
    • 多表查询
      • 如果将来字段越来越多怎么办?
    • 员工信息字段可能有很多,而且员工数有会很多,为提高效率,可以采用分表设计
  • 数据库设计
    • 满汉楼用户表
    • 满汉楼餐桌表
    • 菜谱表
    • 账单表

功能

image-20241215173902720

界面

用户登录界面

image-20241215174323926

显示餐桌状态

image-20241215174503522

预定

image-20241215174623548

显示所有菜品

image-20241215174743016

点餐

image-20241215174832125

查看账单

image-20241215175047426

结账

image-20241215175218981

退出满汉楼

程序框架图

软件分层是逻辑概念
1.可以用不同包来存放对应的类
2.体现了一个调用的关系
3.可以各司其职

image-20241215180733728

image-20241215180821862

项目依赖

commons-dbutils-1.8.1.jar
druid-1.1.10.jar
mysql-connector-java-5.1.23-bin.jar

项目结构

image-20241218213646153

方法调用图

image-20241218215014812

功能实现

准备工具类Utility

在实际开发中,公司都会提供相应的工具类和开发库,可以提高开发效率

登录

接受用户输入员工号和密码
通过员工ID和密码获取员工信息
如果找到匹配的员工信息,则返回该员工对象;否则返回null
如果!=null则登录成功,否则登录失败

显示餐桌状态

调用diningTableService的list方法获取所有餐桌的列表,然后遍历列表,打印每个餐桌的编号和状态到控制台。最后,打印一条分隔线表示显示完毕。

订座

功能说明

如果该餐桌处于已经预定或者就餐状态,给出提示

思路分析

(1)要检测餐桌是否存在。
(2)要检测餐桌的状态

允许用户选择要预订的餐桌,并输入预订信息。如果用户选择取消预订,则方法会输出取消预订的消息。如果用户确认预订,方法会检查所选餐桌是否存在且未被预订,然后接收用户的预订信息并尝试更新餐桌状态。如果预订成功,会输出预订成功的消息;如果失败,会输出预订失败的消息。 如果用户选择取消预订,则方法会输出取消预订的消息。

显示所有菜品

调用menuService的list方法获取所有菜品列表,然后遍历列表并打印每个菜品的编号、名称、类别和价格。
最后,打印一条分隔线表示显示完毕。

点餐

1.功能说明

要求对餐桌号,菜品编号,做合理性校验,如果不合理,给出提示信息

2.思路分析

(1)餐桌号,菜品编号检验
(2)点餐成功,需要修改餐桌状态
(3)生成账单

允许用户选择餐桌号、菜品编号和点餐数量,并确认是否进行点餐。
如果用户选择取消点餐或输入的餐桌号、菜品编号不存在,则方法会提前退出。
如果用户确认点餐,则调用billService的orderMenu方法进行点餐操作,并根据点餐结果输出相应的提示信息。

查看账单

该方法调用billService的list方法获取所有账单列表,并打印账单的详细信息,包括编号、菜品号、菜品量、金额、桌号、日期和状态。打印完毕后,输出一条分隔线表示显示完毕。

结账

思路分析

(1)对餐桌号进行校验
(2)修改bill表的state
(3)修改diningTable信息
(4)不需要增加新表,不需要增加新的类,需要增加方法

提供结账服务,允许用户选择餐桌进行结账操作。用户可以选择不同的结账方式,并在确认后执行结账。如果用户在过程中选择取消或输入无效信息,将终止结账流程。

退出满汉楼

image-20241218203143438

扩展思考

多表查询

image-20241218203007980

package com.hspedu.mhl.domain;import java.util.Date;/*** @program: mhl* @since: jdk1.8* @description: 这是一个javabean 可以和多张表进行对应* @author: Administrator* @create: 2024-12-18 20:43**/
public class MultiTableBean {private Integer id;private String billId;private Integer menuId;private Integer nums;private Double money;private Integer diningTableId;private Date billDate;private String state;// 增加一个来自menu表的列nameprivate String name;// 增加一个来自menu表的priceprivate Double price;public MultiTableBean() {}public MultiTableBean(Integer id, String billId, Integer menuId, Integer nums, Double money, Integer diningTableId, Date billDate, String state, String name, Double price) {this.id = id;this.billId = billId;this.menuId = menuId;this.nums = nums;this.money = money;this.diningTableId = diningTableId;this.billDate = billDate;this.state = state;this.name = name;this.price = price;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}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;}@Overridepublic String toString() {return id + "\t\t" + menuId + "\t\t\t" + name + "\t\t\t" + price + "\t\t\t" + nums + "\t\t\t" + money + "\t\t" + diningTableId + "\t\t" + billDate + "\t\t" + state;}
}

image-20241218213542012

如果将来字段越来越多怎么办?

image-20241218212754186

员工信息字段可能有很多,而且员工数有会很多,为提高效率,可以采用分表设计

image-20241218213942554

数据库设计

满汉楼用户表

# 员工表
CREATE TABLE employee (id INT PRIMARY KEY auto_increment,empId VARCHAR (50) UNIQUE NOT NULL DEFAULT '',pwd CHAR(32) NOT NULL DEFAULT '',`name` VARCHAR (50) NOT NULL DEFAULT '',job VARCHAR (50) NOT NULL DEFAULT ''
) CHARSET='utf8';# 测试数据
insert into employee values(null,'6668612',md5('1123456'),'张三丰','经理');
insert into employee values (null,'6668622', md5('1123456'),'小龙女','服务员');
insert into employee values(null,'6668633', md5('123456'),'张无忌','收银员');
insert into employee values(null,'666666',md5('123456'),'老韩','经理');
image-20241215213350987

满汉楼餐桌表

# 餐桌表
CREATE TABLE diningTable(id INT PRIMARY KEY auto_increment,state VARCHAR (20) NOT NULL DEFAULT '',orderName VARCHAR(50) NOT NULL DEFAULT '',orderTel VARCHAR (20) NOT NULL DEFAULT ''
) CHARSET='utf8';# 测试数据
insert into diningTable values(NULL, '空', '','');
insert into diningTable values(NULL, '空', '','');
insert into diningTable values(NULL, '空', '','');
image-20241216195216385

菜谱表

# 菜谱表
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);
image-20241217120142699

账单表

CREATE TABLE bill(id INT PRIMARY KEY auto_increment,billId VARCHAR(50) NOT NULL DEFAULT '',menuId INT NOT NULL DEFAULT 0,nums INT 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

自增主键 账单号(UUID) 菜品编号 份数 金额 餐桌 订单日期 状态

image-20241217223136155

相关文章:

【韩顺平 Java满汉楼项目 控制台版】MySQL+JDBC+druid

文章目录 功能界面用户登录界面显示餐桌状态预定显示所有菜品点餐查看账单结账退出满汉楼 程序框架图项目依赖项目结构方法调用图功能实现登录显示餐桌状态订座显示所有菜品点餐查看账单结账退出满汉楼 扩展思考多表查询如果将来字段越来越多怎么办? 员工信息字段可…...

【HAL库】STM32CubeMX开发----STM32F407----Time定时器中断实验

STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F407----目录 前言 本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。 实现定时器TIM3中断,每1s进一次中断。 定时器计算公式如下: arr 是自动装载值&#x…...

react18+ts 封装图表及词云组件

react18ts 封装图表及词云组件 1.下载依赖包 "echarts": "^5.5.1","echarts-for-react": "^3.0.2","echarts-wordcloud": "^2.1.0",2.创建目录结构 3.代码封装 ChartCard.tsx Wordcloud.tsx 4.调用 import Rea…...

图像根据mask拼接时,边缘有色差 解决

目录 渐变融合(Feathering) 沿着轮廓线模糊: 代码: 泊松融合 效果比较好: 效果图: 源代码: 泊松融合,mask不扩大试验 效果图: 源代码: 两个图像根据mask拼接时,边缘有色差 渐变融合(Feathering) import numpy as np import cv2# 假设 img1, img2 是两个…...

17、ConvMixer模型原理及其PyTorch逐行实现

文章目录 1. 重点2. 思维导图 1. 重点 patch embedding : 将图形分割成不重叠的块作为图片样本特征depth wise point wise new conv2d : 将传统的卷积转换成通道隔离卷积和像素空间隔离两个部分,在保证精度下降不多的情况下大大减少参数量 2. 思维导图 后续再整…...

Spring整合Redis基本操作步骤

Spring 整合 Redis 操作步骤总结 1. 添加依赖 首先&#xff0c;在 pom.xml 文件中添加必要的 Maven 依赖。Redis 相关的依赖包括 Spring Boot 的 Redis 启动器和 fastjson&#xff08;如果需要使用 Fastjson 作为序列化工具&#xff09;&#xff1a; <!-- Spring Boot Re…...

STM32使用SFUD库驱动W25Q64

SFUD简介 SFUD是一个通用SPI Flash驱动库&#xff0c;通过SFUD可以库轻松完成对SPI Flash的读/擦/写的基本操作&#xff0c;而不用自己去看手册&#xff0c;写代码造轮子。但是SFUD的功能不仅仅于此&#xff1a;①通过SFUD库可以实现在一个项目中对多个Flash的同时驱动&#x…...

ArKTS基础组件

一.AlphabetIndexer 可以与容器组件联动用于按逻辑结构快速定位容器显示区域的组件。 子组件 color:设置文字颜色。 参数名类型必填说明valueResourceColor是 文字颜色。 默认值&#xff1a;0x99182431。 selectedColor:设置选中项文字颜色。 参数名类型必填说明valueRes…...

如何理解TCP/IP协议?如何理解TCP/IP协议是什么?

理解TCP/IP协议 1. 什么是TCP/IP协议? TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是一组用于实现网络通信的协议,广泛用于互联网和局域网中。TCP/IP协议栈由一系列协议组成,规定了计算机如何在网络中发送和接收数据。它通常被用来…...

如何使用 Python 连接 SQLite 数据库?

SQLite是一种轻量级的嵌入式数据库&#xff0c;广泛应用于各种应用程序中。 Python提供了内置的sqlite3模块&#xff0c;使得连接和操作SQLite数据库变得非常简单。 下面我将详细介绍如何使用sqlite3模块来连接SQLite数据库&#xff0c;并提供一些实际开发中的建议和注意事项…...

【博弈模型】古诺模型、stackelberg博弈模型、伯特兰德模型、价格领导模型

博弈模型 1、古诺模型&#xff08;cournot&#xff09;&#xff08;1&#xff09;假设&#xff08;2&#xff09;行为分析&#xff08;3&#xff09;经济后果&#xff08;4&#xff09;例题 2、stackelberg博弈模型&#xff08;产量领导模型&#xff09;&#xff08;1&#xff…...

单片机:实现花样灯数码管的显示(附带源码)

单片机实现花样灯数码管显示 数码管&#xff08;七段数码管&#xff09;广泛用于数字显示&#xff0c;例如时钟、计数器、温度计等设备。在本项目中&#xff0c;我们将使用单片机实现花样灯数码管的显示效果。所谓花样灯显示是指通过控制数码管上的各个段位&#xff0c;以不同…...

什么是芯片电阻

有人把Chip Resistor翻译成“芯片电阻”&#xff0c;我觉得翻译成“贴片电阻”或“片状电阻”更合适。有些厂商也称之为”电阻片”&#xff0c;英文写作Resistor Chip。比如&#xff1a;Thick film resistor chips&#xff08;厚膜电阻片&#xff09;、Thin film resistor chip…...

【C++】sophus : geometry.hpp 位姿(SE2 和 SE3)和(2D 直线\3D 平面)转换函数 (五)

这段代码定义了一系列在位姿&#xff08;SE2 和 SE3&#xff09;和几何实体&#xff08;2D 直线和 3D 平面&#xff09;之间进行转换的函数。它利用了 Sophus 库中已有的旋转表示&#xff08;SO2 和 SO3&#xff09;。 以下是函数的详细解释&#xff1a; 1. SO2 与直线&#xf…...

moment()获取时间

moment 是一个 JavaScript 日期处理类库。 使用&#xff1a; //安装 moment npm install moment -- save引用 //在main.js中全局引入 import moment from "moment"设定moment区域为中国 //import 方式 import moment/locale/zh-cn moment.locale(zh-cn); 挂载全…...

Azure虚拟机非托管磁盘大小调整

想要扩容一个Azure VM 的磁盘空间&#xff0c;门户里面竟然无法扩展&#xff0c;点点鼠标就完事的时代在离去&#xff0c;微软越来不想微软。 在门户里面即便使用Azure Cli命令行也不行。 PS /home/gpchina> az disk list [] 返回为空&#xff0c;根本没有返回磁盘。 不过使…...

流匹配模型[Flow Matching]

流匹配模型&#xff1a;概念、优缺点与扩散模型的对比 在生成建模领域&#xff0c;流匹配模型&#xff08;Flow Matching&#xff09;是一种通过学习流场将初始分布&#xff08;通常是高斯噪声&#xff09;变换为目标分布的新型框架。本文将对流匹配模型的概念、与扩散模型的联…...

Unix 和 Windows 的有趣比较

Unix 和 Windows NT 比较 来源于这两本书&#xff0c;把两本书对照来读&#xff0c;发现很多有意思的地方&#xff1a; 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…...

算法(三)——贪心算法

文章目录 定义基本原理基本思路优缺点优点缺点 经典案例及解析找零问题问题描述贪心思路算法解析java代码示例 活动选择问题问题描述贪心思路算法解析java代码示例 车辆路径问题问题描述贪心思路算法分析java代码示例 定义 贪心算法是指在求解问题时&#xff0c;总是做出在当前…...

LeetCode 704.二分查找

LeetCode 704.二分查找 思路&#x1f9d0;&#xff1a; 在本篇以及之后几篇的博客中&#xff0c;博主将会用二分法进行解答&#xff0c;以此巩固二分题型。二分法一般用于具有二段性的数据中使用。比如该题为有序数组&#xff0c;需要我们查找一个目标值target&#xff0c;分析…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...