资源描述
酒店管理系统设计
湖南文理学院芙蓉学院
数据库原理及应用课程设计报告
题目:酒店管理系统
学生姓名:罗杰
学号: 13250110
专业班级:网络工程1301班
同组姓名:冷迅、何易升
指导教师:王兴柱
设计时间: 2015年上学期第18周
指导老师意见:
评定成绩: 签名: 日期:
目录
一、需求分析 .......................... ... ... ........... 3
二、系统运行环境 ................................. ........ 3
三、功能需求描述 ...................................... ...3
四、模块结构图 ........................................... 4
五、数据库设计 ........................................... 4
5.1数据库分析 ........................................ 4
5.2数据库概念设计 ...................... .............. 4
5.3 数据库逻辑结构设计 ................... ............ 5
5.4数据库字典 ...................................... 7
六、程序模块设计 ......................................... 6
6.1功能模块设计...................................... 9
6.2界面设计 ....................................... 10
6.3程序运行....................................... 11
七、模块的实现.........................................12
7.1 JDBC数据库连接部分 ........................13
7.2 开台、点餐功能的实现 ......................15
7.3 结账功能的实现 .................................19
八、总结 ................................................ 22
一、需求分析
随着餐饮行业的迅速发展现有的人工管理方式已经不能满足管理者的需求,广大餐饮业经营者已经意识到使用计算机应用软件的重要性,决定在餐饮企业的经营管理上引入计算机应用软件管理系统。
酒店管理系统的大致功能:
1.开台点餐
2.自动结账
3.菜品管理
4.后台菜系菜品管理
5.日月年结账报表
6.用户设置
本系统采用的语言
(1)本系统采用Java语言,Java是目前使用最为广泛的计算机语言之一。它具有简单面向对象、稳定、与平台无关等特点。说他简单并不是说这门语言很干瘪、而是一种清楚更容易理解的方式实现程序。面向对象是基于对象的变成更符合人的思维方式使人们更容易编写程序。
(2)本系统还采用SQL语言SQL Server具有许多显著优点、易用性、适合分布组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等。
(3)本系统有效的利用Java和SQL的优点。
二、系统运行环境
操作系统为Windows 8、windows 7或windows XP使用的集成开发工具Eclipse 数据库采用SQL Server2005项目运行环境为JDK 8。
三、功能需求描述
1开台签单工作区的功能:主要功能有开台、点菜、加菜、签单、查看开台信息和签单信息。
2.自动结账工作区的功能:一个功能是自动计算当前选中餐台的消费金额,另一个功能是在结账时自动计算找零金额。
3.结账报表工作区功能:日结帐报表、月结账报表、年结账报表。
4.后天管理工作区功能:管理添加信息。
四、模块结构图
模块结构图
五、数据库设计
5.1数据库分析
酒店管理系统的需求包括开台点菜功能、智能化获取菜品功能、自动结账功能、营业额报表功能等。主要涉及的数据表包括台号表、菜品表、消费单表,为了使系统更加的完善还需要为菜品分类,即需要用到菜系表;为了实现菜品的日销售情况统计,还要建立一个消费项目表,用来记录消费单消费的菜品。
5.2数据库概念设计
数据库设计是系统设计过程中的重要组成部分,它是通酒店管理程序设计,通过管理系统的整天需求而制定的,数据库设计的好坏直接影响到系统的后期开发。
5.3 数据库逻辑结构设计
(1)餐台和菜系在本系统中的最简单的实体,在本系统中用来描述餐台信息的只有台号和座位数,而描述菜系的主要是名称。餐台信息表(tb_desk)和菜系信息表(tb_sort)的E-R图如下。
餐台
状态
台号
座位号
餐台信息表的E-R图
菜系
名称
状态
序号
菜系信息表的E-R图
(2)在描述菜品实体时加入了助记码,目的是为了实现智能化获取菜品功能。通过这一功能,系统操作员可以快速的获取顾客所点的菜品信息。菜品信息表(tb_menu)的E-R图如图所示。
菜品
编号
助记码码
系属菜系
名称
状态
单价
单位
菜品信息表的E-R图
(3)消费单信息表(tb_order_form)用来记录每次消费的相关信息,例如消费时使用的餐台、时间、金额等。消费单信息表的E-R图如图所示。
消费单
操作用户
消费时间
消费金额
消费台号
编号
消费信息表的E-R图
消费项目
(4)消费项目信息表(tb_order_item)用来记录每个消费单消费的菜品,记录的主要信息有所属消费单、消费菜品、消费数量、消费额。消费项目信息表E-R图如图所示。
所属消费单
编号
消费数量
消费菜品
消费额
消费项目信息表的E-R图
(5)管理员信息表(tb_manager)用来记录系统的管理员的账号、密码、权限等信息。管理员信息表E-R图如图所示。
管理员
初始化系统权限
系统维修权限
销售统计权限
人员管理权限
编号
用户名
密码
管理员信息表的E-R图
(6)员工信息表(tb_record)用来记录职工的信息,编号、姓名、性别、出生日期、地址等等。职工信息表E-R图如图所示。
员工信息
地址
出生日期码
身份证号
状态
编号
员工姓名
性别
员工信息表的E-R图
5.4数据库字典
5.4.1.餐台信息表
表名
tb_desk
序号
字段名
数据类型
约束
备注
1
num
varchar(6)
非空
台号
2
seating
int
非空
座位数
3
state
char(4)
非空
状态
5.4.2.管理员表
表名
tb.manager
序号
字段名
数据类型
约束
备注
1
id
int
非空
编号
2
record_num
char(9)
非空
用户名
3
password
varchar(20)
非空
登陆密码
4
purview_system
char(2)
允许空
系统维修权限
5
purview_sell
char(2)
允许空
销售统计权限
6
purview_personnel
char(2)
允许空
人员管理权限
7
purview_init
char(2)
允许空
初始化系统权限
5.4.3.菜品信息表
表名
tb.menu
序号
字段名
数据类型
约束
备注
1
num
char(9)
非空
编号
2
sort_id
int
非空
所属菜系
3
name
varchar(20)
非空
名称
4
code
varchar(10)
非空
主机名
5
unit
varchar(4)
非空
单位
6
unit_price
int
非空
单价
7
state
char(4)
非空
状态
5.4.4.消费单信息表
表名
tb_order_form
序号
字段名
数据类型
约束
备注
1
num
char(11)
非空
编号
2
Desk_num
varchar(6)
非空
消费餐台
3
Consume_date
datetime
非空
消费时间
4
expenditure
int
非空
消费金额
5
Record_num
char(9)
非空
操作用户
5.4.5.消费项目信息表
表名
tb_order_item
序号
字段名
数据类型
约束
备注
1
id
int
非空
编号
2
Order_form_num
char(11)
非空
所属消费单
3
Menu_num
char(9)
非空
消费菜品
4
amount
int
非空
消费数量
5
total
int
非空
消费额
5.4.6.员工表
表名
tb_record
序号
字段名
数据类型
约束
备注
1
num
char(9)
非空
编号
2
name
varchar(8)
非空
员工姓名
3
sex
char(2)
非空
性别
4
birthday
datetime
非空
出生日期
5
Id_card
varchar(20)
非空
身份证号
6
address
varchar(100)
非空
地址
7
state
char(4)
非空
状态
5.4.7.菜系信息表
表名
th.sort
序号
字段名
数据类型
约束
备注
1
id
int
非空
序号
2
name
varchar(20)
非空
名称
3
state
char(4)
非空
状态
六、程序模块设计
6.1功能模块设计:
6.2界面设计:
登入界面设计
管理员界面设计
6.3程序运行:
登入界面
管理界面
管理员界面
七、模块的实现
7.1 JDBC数据库连接部分
packagecom.mwq.dao;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
public class JDBC {
private static final String DRIVERCLASS = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=db_DrinkeryManage";
private static final String USERNAME = "luojie";
private static final String PASSWORD = "123456";
private static final ThreadLocal<Connection>threadLocal = new ThreadLocal<Connection>();
static {// 在静态代码块中加载数据库驱动
try {
Class.forName(DRIVERCLASS).newInstance();// 加载数据库驱动
} catch (Exception e) {
System.out.println("数据库连接不成功");
e.printStackTrace();
}
}
public static Connection getConnection() {// 创建数据库连接的方法
System.out.println("数据库连接成功");
Connection conn = threadLocal.get();// 从线程中获得数据库连接
if (conn == null) {// 没有可用的数据库连接
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);// 创建新的数据库连接
threadLocal.set(conn);// 将数据库连接保存到线程中
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;// 返回数据库连接
}
public static booleancloseConnection() {// 关闭数据库连接的方法
booleanisClosed = true;// 默认关闭成功
Connection conn = threadLocal.get();// 从线程中获得数据库连接
if (conn != null) {// 数据库连接可用
threadLocal.set(null);// 清空线程中的数据库连接
try {
conn.close();// 关闭数据库连接
} catch (SQLException e) {
isClosed = false;// 关闭失败
e.printStackTrace();
}
}
return isClosed;// 返回关闭结果
}
}
7.2 开台点餐功能的实现
7.2.1 台号选择框的创建
numComboBox = newJComboBox(); // 创建台号选择框
numComboBox.setNextFocusableComponent(codeTextField); // 设置下一个将要获得焦点的组件
initNumComboBox(); // 初始化台号选择框
numComboBox.addActionListener(newActionListener() {
publicvoidactionPerformed(ActionEvent e) {
introwCount = rightTable.getRowCount(); // 获得已开台数
if (rowCount == 0) // 没有开台
return; // 不执行任何操作
Object selectedDeskNum = numComboBox.getSelectedItem(); // 获得“台号”选择框中的选中项
intneedSelectedRow = -1; // 默认选中的台号未开台
for (int row = 0; row <rowCount; row++) { // 查看选中的台号是否已经开台
if (selectedDeskNum.equals(rightTable.getValueAt(row, 1))) { // 已经开台
needSelectedRow = row; // 保存其在“开台列表” 中的所在行
break; // 跳出循环
}
}
if (needSelectedRow == -1) { // 选中的台号尚未开台,即将要开台
rightTable.clearSelection(); // 取消选择“开台列表”中的选中行
leftTableDataV.removeAllElements(); // 清空“签单列表”中的所有行
leftTableModel.setDataVector(leftTableDataV,
leftTableColumnV); // 刷新“签单列表”表格模型的数据
} else { // 选中的台号已经开台,即将要添加消费项目
rightTable.setRowSelectionInterval(needSelectedRow);// 在“开台列表”中选中该台号
leftTableDataV.removeAllElements(); // 清空“签单列表”中的现有项目
leftTableDataV.addAll(itemOfDeskV.get(needSelectedRow)); // 向“签单列表”添加新选中餐台的消费项目
leftTableModel.setDataVector(leftTableDataV,
leftTableColumnV); // 刷新“签单列表”表格模型的数据
leftTable.setRowSelectionInterval(0); // 选中“签单列表”中的第一行
}
}
});
7.2.2开单功能的实现
finalJButtonaddButton = newMButton();
addButton.setIcon(newImageIcon(TipWizardFrame.class
.getResource("/img/main_add.png")));
addButton.setRolloverIcon(newImageIcon(TipWizardFrame.class
.getResource("/img/main_add_on.png")));
addButton.addActionListener(newActionListener() {
publicvoidactionPerformed(ActionEvent e) {
makeOutAnInvoice();
codeTextField.requestFocus();
}
});
orderDishesButtonPanel.add(addButton);
orderDishesPanel.add(numComboBox);
7.2.3签单功能的实现
finalJButtonsubButton = newMButton();// 创建按钮
subButton.setIcon(newImageIcon(getClass().getResource(
"/img/main_sub.png")));// 按钮默认时显示的图片
subButton.setRolloverIcon(newImageIcon(getClass().getResource(
"/img/main_sub_on.png")));// 光标移入时显示的图片
subButton.addActionListener(newActionListener() {
publicvoidactionPerformed(ActionEvent e) {
intselectedRow = rightTable.getSelectedRow();// 获得“开台列表”中的选中行
if (selectedRow< 0) {// 未选中任何行
JOptionPane.showMessageDialog(null, "请选择要签单的台号!", "友情提示",
JOptionPane.INFORMATION_MESSAGE);
return;
} else {
intlastRowIndex = leftTable.getRowCount() - 1;// 获得最后一个消费项目的索引
Object lastRowSign = leftTable.getValueAt(lastRowIndex, 0);// 获得最后一个消费项目的标记
if (lastRowSign.equals("NEW")) {// 为未签单项目
Object firstRowSign = leftTable.getValueAt(0, 0);// 获得第一个消费项目的标记
if (firstRowSign.equals("NEW")) {// 为未签单项目,即为新开台签单
for (int row = lastRowIndex; row >= 0; row--) {
leftTable.setValueAt("", row, 0);// 签单
}
} else {// 为已签单项目,即为新添加菜品签单
for (int row = lastRowIndex; row >= 0; row--) {
if (leftTable.getValueAt(row, 0).equals("NEW"))// 为未签单项目
leftTable.setValueAt("", row, 0);// 签单
else
// 为已签单项目,即为新添加菜品签单完成
break;
}
}
}
}
}
});
orderDishesButtonPanel.add(subButton);
7.3 结账功能的实现
finalJButtoncheckOutButton = newJButton();
checkOutButton.setText("结 账");
checkOutButton.addActionListener(newActionListener() {
publicvoidactionPerformed(ActionEvent e) {
intselectedRow = rightTable.getSelectedRow();
if (selectedRow< 0) {// 未选中任何餐台
JOptionPane.showMessageDialog(null, "请选择要结账的餐台!", "友情提示",
JOptionPane.INFORMATION_MESSAGE);// 弹出提示
return;
}
introwCount = leftTable.getRowCount();// 获得结账餐台的点菜数量
if (leftTable.getValueAt(rowCount - 1, 0).equals("NEW")) {// 存在未签单菜品
JOptionPane.showMessageDialog(null, "请先确定未签单商品的处理方式!",
"友情提示", JOptionPane.INFORMATION_MESSAGE);// 弹出提示
return;
}
int expenditure = Integer.valueOf(expenditureTextField
.getText());// 获得消费金额
intrealWages = Integer.valueOf(realWagesTextField.getText());// 获得实收金额
if (realWages< expenditure) {// 查看实收金额是否小于消费金额
if (realWages == 0)// 未输入实收金额
JOptionPane.showMessageDialog(null, "请输入实收金额!", "友情提示",
JOptionPane.INFORMATION_MESSAGE);// 弹出提示
else
// 实收金额小于消费金额
JOptionPane.showMessageDialog(null, "实收金额不能小于消费金额!",
"友情提示", JOptionPane.INFORMATION_MESSAGE);// 弹出提示
realWagesTextField.requestFocus();// 为“实收金额”文本框请求获得焦点
return;
}
changeTextField.setText((realWages - expenditure) + "");// 计算并设置“找零金额”
String[] orderFormData = {
getNum(),
rightTable.getValueAt(selectedRow, 1).toString(),
Today.getDate() + " "
+ rightTable.getValueAt(selectedRow, 2),
expenditureTextField.getText(),
TipWizardFrame.this.managerV.get(0).toString() };// 组织消费单信息
dao.iOrderForm(orderFormData);// 持久化到数据库
String[] orderItemData = new String[4];// 用来存储消费项目信息
orderItemData[0] = dao.sOrderFormOfMaxId();// 获得消费单编号
for (int row = 0; row <rowCount; row++) {// 通过循环持久化消费项目信息
orderItemData[1] = leftTable.getValueAt(row, 2).toString();// 获得菜品编号
orderItemData[2] = leftTable.getValueAt(row, 5).toString();// 获得菜品数量
orderItemData[3] = leftTable.getValueAt(row, 7).toString();// 获得菜品消费金额
dao.iOrderItem(orderItemData);// 持久化到数据库
}
JOptionPane.showMessageDialog(null, rightTable.getValueAt(
selectedRow, 1)
+ " 结账完成!", "友情提示", JOptionPane.INFORMATION_MESSAGE);// 弹出提示
//
rightTableModel.removeRow(selectedRow);// 从“开台列表”中移除结账餐台
leftTableDataV.removeAllElements();// 清空“签单列表”
leftTableModel.setDataVector(leftTableDataV, leftTableColumnV);// 刷新“签单列表”
realWagesTextField.setText("0");// 清空“实收金额”文本框
changeTextField.setText("0");// 清空“找零金额”文本框
itemOfDeskV.remove(selectedRow);// 从数据集中移除结账餐台
}
});
checkOutButton.setMargin(new Insets(2, 14, 2, 14));
checkOutButton.setFont(new Font("", Font.BOLD, 12));
finalGridBagConstraints gridBagConstraints_10 = newGridBagConstraints();
gridBagConstraints_10.anchor = GridBagConstraints.EAST;
gridBagConstraints_10.gridwidth = 2;
gridBagConstraints_10.insets = newInsets(10, 0, 0, 0);
gridBagConstraints_10.gridy = 2;
gridBagConstraints_10.gridx = 1;
checkOutPanel.add(checkOutButton, gridBagConstraints_10);
八、总结
经过这次的学习。了解了关于数据库程序设计,学习了JDBC的连接方法,更加深入的学习了SQL Server的使用,通过对Eclipse中Windows Builder插件的学习和使用,方便快捷的进行可视化界面开发,大大提高了系统开发的效率。
参考文献
1.李俊山 ,罗蓉,赵方舟,数据库原理及应用(SQL sever).北京:清华大学出版社,2009
2.李俊山,罗蓉,叶霞,杨百龙。数据库系统原理与设计-内容解释与习题解答。西安:西安交通大学出版社,2006.
3.刘金岭,冯万利,周泓。数据库系统及应用实验与课程设计指导-SQL Server 2008.清华大学出版社,2014.
4.梁竞敏,黄华林,宋广科。SQL Server 2005 数据库任务化教程。中国水利水电出版社。2009.
22页
展开阅读全文