本项目为我的大二课程设计项目,仅供学习使用!

目 录

1 项目概述... 1

2 需求分析... 2

2.1 总体目标... 2

2.2 具体目标... 2

2.3 系统功能建模... 2

2.3.1 系统数据流程图... 2

2.3.2 数据字典... 3

2.4 系统数据模型... 4

3 概要设计... 6

3.1 体系结构设计... 6

3.2 数据库设计... 6

3.2.1 关系模式设计... 6

3.2.2 物理表结构设计... 7

4 详细设计... 10

4.1 登录模块... 10

4.2 点餐模块... 11

5 系统实现... 12

5.1 实现技术... 12

5.2 应用程序配置... 12

5.3 业务逻辑代码... 12

5.4 数据库代码... 23

6 结束语... 29

7 参考文献... 30

1 项目概述

本项目是一个饭店管理系统。

主要实现了用户的登录,开台,点餐,结算等功能。

管理端实现了订单管理,餐台管理,用户管理和菜品管理。

可以利用本系统对餐厅,饭店的点餐,订单和菜品进行系统的管理,提升饭店餐厅的管理效率。

主程序和GUI:使用IDEA开发的JAVA程序

数据库:使用Navicat管理的MySQL数据库

连接:使用JDBC驱动进行数据库与Java程序连接

2 需求分析

2.1 总体目标

系统目标:

1.窗体界面设计友好、美观

2.基本信息管理方便、快捷

3.具有良好的数据查询功能,方便管理员和用户的操作

4.系统运行稳定、系统数据安全可靠

5.最大限度地实现系统的易维护性和易操作性

2.2 具体目标

具体目标:

1.登录:输入账户名和密码,进行登录。

2.基本信息管理:用户管理,餐台管理,菜品分类管理,菜品管理。

3.点餐管理:点餐(开台点餐,点餐信息增删改查)

4.结算管理:结算,结算后餐台空闲

5.统计查询:菜品销售查询,收入统计

2.3 系统功能建模

2.3.1 系统数据流程图

详细数据流图如图2-1所示。

img

图 2‑1

此DFD图有两个接口,分别是用户和管理员

用户输出:订座信息,点餐信息,付款信息

管理员输出:用户管理信息,菜品变动信息,餐台管理信息,订单管理信息

用户收到:餐台信息,菜品信息,发票信息,用户状态信息

管理员收到:销售数据

2.3.2 数据字典

数据字典如图 2-2所示。

img

图 2‑2

主要数据有:用户信息、管理员信息,菜品信息,餐台信息,菜单信息

这些数据分别存储于用户数据库、管理员数据库、菜品数据库、餐台数据库、菜单数据库

2.4 系统数据模型

系统数据模型,即E-R图,如图 2-3所示。

img

图 2‑3

实体有:用户,订单,菜单,菜品,餐台,管理员

实体关系:

用户-点餐-订单:一对多

订单-占用-餐台:一对一

订单-关联-菜单:一对多

菜单-包含-菜品:多对多

管理员-处理-餐台/菜单:三实体多对多

3 概要设计

3.1 体系结构设计

系统功能模块图如图 3-1所示。

img

图 3‑1

饭店管理系统分用户和管理员两个模块。

用户模块中又包含订座、点餐、结账三个模块;

前两个对应了餐台选择和菜品选择模块。

管理员模块中包含用户管理,菜品管理和订单管理模块

分别包含注册、删除;菜品、库存增删;订单取消、删除模块。

3.2 数据库设计

3.2.1 关系模式设计

User (UID, UName, Password, Tele, Point)

Admin (AID, AName, Password, Tele)

Order (OID, SID, OMID, Note, Price, isPay)

OrderMenu (OMID, OID, FID)

Seat (SID, Anum,State)

Food (FID, FName, Class, Price, Inventory)

3.2.2 物理表结构设计

管理员设计参数见表 3-1所示。

表 3‑1 管理员表

列含义 列标示 类型 长度 完整性约束
管理员ID AID Int 2 主键
管理员名 AName Varchar 20 非空
密码 Password Varchar 30 非空
电话 Tele Char 11

用户设计参数见表 3-2所示。

表 3‑2 用户表

列含义 列标示 类型 长度 完整性约束
用户ID UID Int 10 主键
用户名 UName Varchar 20 非空
密码 Password Varchar 30 非空
电话 Tele Char 11
积分 Point Int 225

餐台设计参数见表 3-3所示。

表 3‑3 餐台表

列含义 列标示 类型 长度 完整性约束
餐台号 SID Int 3 主键
座位数 Anum Int 2 非空
是否空闲 State Int 1 非空

菜品设计参数见表 3-4所示。

表 3‑4 菜品表

列含义 列标示 类型 长度 完整性约束
菜品ID FID Int 4 主键
菜品名 FName Varchar 20 非空
类别 Class Varchar 20
价格 Price Decimal 5-2
库存 Inventory Int 5

订单设计参数见表 3-5所示。

表 3‑5 订单表

列含义 列标示 类型 长度 完整性约束
订单号 OID Int 10 主键
备注 Note Varchar 225
价格 Price Decimal 10-2
付款状态 isPay Int 1 非空
座位号 SID Int 3 外键

菜单设计参数见表 3-6所示。

表 3‑6 菜单表

列含义 列标示 类型 长度 完整性约束
菜号 OMID Int 10 主键
订单号 OID Int 10 外键
菜品号 FID Int 4 外键

4 详细设计

4.1 登录模块

登录模块如图 4-1所示。

img

图 4‑1

在登录时,先判断是否为管理员,若为管理员,直接进行登录验证,否则调用用户管理系统操作。输入账号密码时,先后判断是否为空,账号是否存在,密码是否对应。当都通过时,登录成功,否则重新输入。

4.2 点餐模块

点餐模块如图 4-2所示。

img

图 4‑2

点餐时,先查看并选择数据库中的菜品,然后将菜品添加到清单中,进行确认订单后,将清单信息更新到订单数据库

5 系统实现

5.1 实现技术

使用Ecilpse + WindowBuilder进行GUI和JAVA程序的开发

使用Navicat对MYSQL数据库进行管理

5.2 应用程序配置

JAVASE 1.7的开发及运行环境

MYSQL数据库版本为5.7.33

5.1.47的JDBC驱动进行JAVA程序和数据库的连接

5.3 业务逻辑代码

Hms.model:

*LoginContrl.Java*

//登录控制

package hms.model;

import java.sql.*;

import hms.util.DBUtil;

public class LoginControl {

public static boolean isAdmin;

public static int id;

//验证密码

public static boolean LoginCheck(boolean isAdmin, int id, String password) throws ClassNotFoundException, SQLException {

​ String SQL = "SELECT password FROM ";

​ if (!isAdmin) {

​ SQL = SQL + "user where uid = " + id;

​ } else {

​ isAdmin = true;

​ SQL = SQL + "admin where aid = " + id;

​ }

​ ResultSet resultSet = DBUtil.query(SQL);

​ if (!resultSet.next()) {

​ try {

​ DBUtil.closeConnection();

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ return false;

​ } else if (!resultSet.getObject("password").equals(password)) {

​ try {

​ DBUtil.closeConnection();

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ return false;

​ }

​ try {

​ DBUtil.closeConnection();

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ LoginControl.id = id;

​ try {

​ ReadInformation();

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ System.out.println("\nSucesss!\nisAdmin:" + isAdmin + "\nid:" + LoginControl.id);

​ return true;

}

//信息读入

public static void ReadInformation() throws Exception {

​ if (isAdmin) {

​ } else {

​ User.userInformationRead(id);

​ }

}

}

*Seat.Java*

//餐台管理

package hms.model;

import java.sql.*;

import hms.util.DBUtil;

public class Seat {

public static int[] SID = new int[100];

public static int[] Anum = new int[100];

public static int[] State = new int[100];

public static int USID;

public static int UAnum;

//座位获取

public static void getSeats() throws Exception {

​ String SQL = "SELECT * FROM seat";

​ ResultSet resultSet = DBUtil.query(SQL);

​ for (int i = 1; resultSet.next(); i++) {

​ SID[i] = resultSet.getInt("SID");

​ Anum[i] = resultSet.getInt("Anum");

​ State[i] = resultSet.getInt("State");

​ }

​ DBUtil.closeConnection();

}

//剩余座位量获取

public static int remainingSeats(int Anum) throws Exception {

​ int num = 0;

​ String SQL = "SELECT * FROM seat where Anum =";

​ SQL = SQL + " " + Anum;

​ ResultSet resultSet = DBUtil.query(SQL);

​ while (resultSet.next()) {

​ if(resultSet.getInt("State") == 0) {

​ num++;

​ }

​ }

​ DBUtil.closeConnection();

​ return num;

}

//确认座位

public static boolean SeatConfirm() throws Exception {

​ String SQL = "SELECT * FROM seat WHERE Anum = ";

​ SQL = SQL + UAnum + " AND State = 0";

​ ResultSet resultSet = DBUtil.query(SQL);

​ resultSet.next();

​ try {

​ USID = resultSet.getInt("SID");

​ } catch (Exception e) {

​ return false;

​ }

​ String SQL2 = "UPDATE seat SET State = 1 WHERE SID = ";

​ SQL2 = SQL2 + USID;

​ DBUtil.update(SQL2);

​ DBUtil.closeConnection();

​ return true;

}

//座位状态更改

public static void StateChange(int State,int SID) throws Exception {

​ String SQL = "UPDATE seat SET State = ";

​ SQL = SQL + State +" WHERE SID = "+ SID;

​ DBUtil.update(SQL);

​ DBUtil.closeConnection();

}

}

*Food.Java*

//菜品管理

package hms.model;

import java.sql.ResultSet;

import javax.swing.ImageIcon;

import hms.util.DBUtil;

import hms.view.OrderFrame;

public class Food {

//菜名获取

public static String[] getFoodsName(String Class) throws Exception {

​ String[] list = new String[20];

​ String SQL = "SELECT FName FROM Food WHERE Class like '";

​ SQL = SQL + Class +"'";

​ ResultSet resultSet = DBUtil.query(SQL);

​ for (int i = 0; resultSet.next(); i++) {

​ list[i] = resultSet.getString("FName");

​ }

​ DBUtil.closeConnection();

​ return list;

}

//菜品图片读入

public static ImageIcon getIcon(int FID) {

​ try {

​ ImageIcon testtt = new ImageIcon(OrderFrame.class.getResource("/img/" + FID + ".jpg"));

​ } catch (Exception e) {

​ return null;

​ }

​ ImageIcon icon = new ImageIcon(OrderFrame.class.getResource("/img/" + FID + ".jpg"));

​ return icon;

}

public static int CFid = 1;

public static String CFName = "红烧肉";

public static float CFPrice = (float) 18.00;

public static int CFInventory = 35;

public static int allPrice = 0;

//菜品选择

public static void foodChoose(String FName) throws Exception {

​ String SQL = "SELECT * FROM Food WHERE FName like '";

​ SQL = SQL + FName +"'";

​ ResultSet resultSet = DBUtil.query(SQL);

​ while (resultSet.next()) {

​ CFid = resultSet.getInt("FID");

​ CFName = resultSet.getString("FName");

​ CFPrice = resultSet.getInt("Price");

​ CFInventory = resultSet.getInt("Inventory");

​ }

​ DBUtil.closeConnection();

}

public static String[] orderStrings = new String[20];

public static int listNum = 0;

//菜单添加菜品

public static void addFood() {

​ orderStrings[listNum] = CFName;

​ listNum++;

​ allPrice += CFPrice;

}

}

*Order.Java*

//订单管理

package hms.model;

import java.sql.ResultSet;

import hms.util.DBUtil;

public class Order {

public static int OID;

//创建订单

public static void creatOrder() throws Exception {

​ int lastOID = 0;

​ String SQL = "SELECT OID FROM order ORDER BY OID";

​ ResultSet resultSet = DBUtil.query(SQL);

​ while (resultSet.next()) {

​ lastOID = resultSet.getInt(1);

​ }

​ DBUtil.closeConnection();

​ System.out.println(lastOID);

​ OID = lastOID + 1;

​ String SQL2 = "INSERT INTO order (OID,isPay,SID) VALUES ('";

​ SQL2 = SQL2 + OID + "','0','" + Seat.USID + "')";

​ DBUtil.update(SQL2);

​ DBUtil.closeConnection();

}

public static int OMID;

//上传订单和菜单

public static void updateOrder() throws Exception {

​ int lastOMID = 0;

​ String SQL = "SELECT OMID FROM ordermenu ORDER BY OMID";

​ ResultSet resultSet = DBUtil.query(SQL);

​ while (resultSet.next()) {

​ lastOMID = resultSet.getInt(1);

​ }

​ DBUtil.closeConnection();

​ System.out.println(lastOMID);

​ OMID = lastOMID + 1;

​ for (int i = 0; Food.orderStrings[i] != null; i++) {

​ int FID = 0;

​ String SQL3 = "SELECT FID FROM Food WHERE FName like '";

​ SQL3 = SQL3 + Food.orderStrings[i] + "'";

​ ResultSet resultSet2 = DBUtil.query(SQL3);

​ while (resultSet2.next()) {

​ FID = resultSet2.getInt("FID");

​ }

​ String SQL2 = "INSERT INTO ordermenu (OMID,FID,OID) VALUES ('";

​ SQL2 = SQL2 + OMID + "','" + FID + "','" + OID + "')";

​ DBUtil.update(SQL2);

​ OMID++;

​ DBUtil.closeConnection();

​ }

​ String SQL4 = "UPDATE order SET Price =";

​ SQL4 = SQL4 + Food.allPrice + " WHERE OID = " + OID;

​ DBUtil.update(SQL4);

​ DBUtil.closeConnection();

}

//结算处理

public static void payDeal() throws Exception {

​ String SQL = "UPDATE order SET isPay = 1 WHERE OID = ";

​ SQL = SQL + OID;

​ DBUtil.update(SQL);

​ DBUtil.closeConnection();

​ String SQL2 = "UPDATE user SET Point = Point + ";

​ SQL2 = SQL2 + Food.allPrice + " WHERE UID = " + User.UID;

​ DBUtil.update(SQL2);

​ DBUtil.closeConnection();

}

//根据订单号获取座位号

public static int getSID(int OID) throws Exception {

​ int SID = 0;

​ String SQL = "SELECT SID FROM order where OID = ";

​ SQL = SQL + OID;

​ ResultSet resultSet = DBUtil.query(SQL);

​ while (resultSet.next()) {

​ SID = resultSet.getInt(1);

​ }

​ return SID;

}

//订单删除

public static void OrderDelet(int OID) throws Exception {

​ String SQL = "DELETE FROM order WHERE OID = ";

​ SQL = SQL + OID;

​ DBUtil.update(SQL);

​ DBUtil.closeConnection();

}

//获取总营业额

public static float getTotalTurnover() throws Exception {

​ float TotalTurnover = 0;

​ String SQL = "SELECT Price From order";

​ ResultSet resultSet = DBUtil.query(SQL);

​ while (resultSet.next()) {

​ TotalTurnover += resultSet.getFloat(1);

​ }

​ return TotalTurnover;

}

//获取总销量

public static int getTotalSales() throws Exception {

​ int TotalSales = 0;

​ String SQL = "SELECT OMID From ordermenu";

​ ResultSet resultSet = DBUtil.query(SQL);

​ while (resultSet.next()) {

​ TotalSales++;

​ }

​ return TotalSales;

}

}

5.4 数据库代码

Hms.util

*DBUtil.Java*

//数据库连接与操作的抽象

package hms.util;

import java.sql.*;

public class DBUtil {

public static final String DBDRIVER = "com.mysql.jdbc.Driver";

public static final String DBURL = "jdbc:mysql://localhost:3306/resmsc?useSSL=false&useUnicode=true&characterEncoding=UTF-8";

public static final String DBUSER = "LNTU_DDC";

public static final String DBPASS = "jtcsm";

public static Connection connection = null;

//获取并返回连接

public static Connection getConnection() throws ClassNotFoundException, SQLException {

​ Connection con = null;

​ try {

​ Class.forName(DBDRIVER);

​ } catch (ClassNotFoundException e) {

​ e.printStackTrace();

​ }

​ try {

​ con = DriverManager.getConnection(DBURL, DBUSER, DBPASS);

​ } catch (SQLException e) {

​ e.printStackTrace();

​ }

​ System.out.println("connect to db");

​ return con;

}

//数据库查找

public static ResultSet query(String sql) throws ClassNotFoundException, SQLException {

​ connection = getConnection();

​ Statement statement = connection.createStatement();

​ ResultSet resultSet = statement.executeQuery(sql);

​ return resultSet;

}

//数据库更新

public static int update(String sql) throws ClassNotFoundException, SQLException {

​ connection = getConnection();

​ Statement statement = connection.createStatement();

​ int UpdateLine = statement.executeUpdate(sql);

​ return UpdateLine;

}

//关闭连接

public static void closeConnection() throws Exception {

​ connection.close();

}

}

SQL****建表语句

Admin

DROP TABLE IF EXISTS admin;

CREATE TABLE admin (

AID int(2) NOT NULL,

AName varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

Password varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

Tele char(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

PRIMARY KEY (AID) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

Food

DROP TABLE IF EXISTS food;

CREATE TABLE food (

FID int(4) NOT NULL,

FName varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

Class varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

Price decimal(5, 2) NULL DEFAULT NULL,

Inventory int(5) NULL DEFAULT NULL,

PRIMARY KEY (FID) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

Order

DROP TABLE IF EXISTS order;

CREATE TABLE order (

OID int(10) NOT NULL,

Note varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

Price decimal(10, 2) NULL DEFAULT NULL,

isPay int(1) NOT NULL,

SID int(3) NULL DEFAULT NULL,

PRIMARY KEY (OID) USING BTREE,

INDEX SID(SID) USING BTREE,

CONSTRAINT SID FOREIGN KEY (SID) REFERENCES seat (SID) ON DELETE SET NULL ON UPDATE RESTRICT

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

Ordermenu

DROP TABLE IF EXISTS ordermenu;

CREATE TABLE ordermenu (

OMID int(10) NOT NULL,

FID int(4) NULL DEFAULT NULL,

OID int(10) NULL DEFAULT NULL,

PRIMARY KEY (OMID) USING BTREE,

INDEX FID(FID) USING BTREE,

INDEX OID(OID) USING BTREE,

CONSTRAINT FID FOREIGN KEY (FID) REFERENCES food (FID) ON DELETE SET NULL ON UPDATE RESTRICT,

CONSTRAINT OID FOREIGN KEY (OID) REFERENCES order (OID) ON DELETE SET NULL ON UPDATE RESTRICT

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

Seat

DROP TABLE IF EXISTS seat;

CREATE TABLE seat (

SID int(3) NOT NULL,

Anum int(2) NOT NULL,

State int(1) NOT NULL,

PRIMARY KEY (SID) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

User

DROP TABLE IF EXISTS user;

CREATE TABLE user (

UID int(10) NOT NULL,

UName varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

Password varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

Tele char(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

Point int(20) UNSIGNED NULL DEFAULT NULL,

PRIMARY KEY (UID) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

6 结束语

此次开发使我能够熟练的使用WindowBuilder进行GUI窗口设计,能够熟练的使用面向对象的思想进行Java程序的开发,并且学会了JDBC能够使用JAVA程序对数据库进行增删改查,还加强了对SQL语句的熟练程度,能够快速的对数据库进行操作。

我所开发的饭店管理系统以对用户端的体验为开发方向着重开发,当用户进行点餐时,仅仅进行单击操作就可以完整的进行选座,选餐,支付这一整套就餐步骤,极大的提升了用户体验;但由于时间关系在管理端还存在未开发完毕的功能,在时间充沛的情况下我会进行改进,并且以后提高自己的开发速度以避免再次出现这种情况。

7 参考文献

[1]张海藩,牟永敏. 软件工程导论[M] .北京.清华大学出版社. 2013(06)

[2]耿祥义,张跃平. Java程序设计精编教程[M] .北京.清华大学出版社. 2017(03)

[3]王珊,萨师煊. 数据库系统概论[M].北京.高等教育出版社. 2014(05)

[4] 张英,杜炜. JDBC数据库连接池技术简介及设计[J]. 电脑知识与技术. 2010 (08)

[6] 赵海龙,戴玉刚. JDBC驱动程序及其选择分析[J]. 福建电脑. 2008 (02)

[7] 罗荣,唐学兵. 基于JDBC的数据库连接池的设计与实现[J]. 计算机工程. 2004 (09)

[8] 何明,戴钢,葛正义. 基于JDBC语句分享的数据库连接池[J]. 铁路计算机应用. 2002 (11)

[9] 张廷玉,石伟伟. 基于JDBC的WebGIS异构数据库存取技术[J]. 测绘通报. 2000 (01)

[10] 谢人强. 选用合适的JDBC驱动程序[J]. 电脑知识与技术(学术交流). 2007 (02)

[11] 孙国志. 面向软件工程的工作流管理系统研究[J]. 企业技术开发. 2014 (11)