资源描述
管理信息系统课程设计
河南工业职业技术学院
毕业设计任务书
类 别: 三年制高职
专 业: 软件技术
班 级: 软件1301
姓 名: 高杰
毕业设计题目: 酒店管理系统
指导教师姓名: 姜燕
负责人签字:
年 月 日
摘要
旅游和科技化的浪潮使得酒店和餐饮行业发展的如火如荼,如何以方便、快捷、经济的方式来对该行业进行有效管理是一个重要问题,随着科学技术的不断提高,计算机科学日渐成熟,在社会的各个领域并发挥着越来越重要的作用。也使得软件成了解决问题的有效途径。
酒店管理系统以方便、快捷、费用低的优点正慢慢地进入人们的生活,将传统的酒店管理方式彻底的解脱出来,提高效率,减轻工人人员以往繁忙的工作,减小出错的概率。本系统从满足客户的需求角度出发,实现了酒店管理的基本流程。系统的主要功能包括前台服务、后台管理、销售统计、系统安全、人员管理、初始化系统等等。用户在酒店消费的时候所要等待的时间就会大大的减少,操作员能够很方便的对用户信息的登记和对用餐状态的的管理,从而实现了酒店管理系统高效、准确的特点。
本论文全面介绍了酒店管理系统设计的过程,系统是利用MyEclipse 7.0作为数据库前端开发工具, SQL Server 2005为后台数据库,主要采用Windows XP/Windows 7作为操作系统,采用java为开发语言,本着易实用性,扩展性,可移植性的原则,采用c/s模式开发 ,实现酒店管理信息化的发展需求。
关键词: 数据库SQL Server2005;MyEclipse 7.0;酒店管理系统。
目 录
第一章 系统概述 -------------------------------------------- 1
1.1 开发背景 -----------------------------------------1
1.2 开发语言简介-----------------------------------
1.3 系统简介 -----------------------------------------
第二章 可行性分析-----------------------------------------
2.1 技术可行性-----------------------------------------
2.2 管理可行性-----------------------------------------
2.3 经济可行性-----------------------------------------
第三章 系统需求分析--------------------------------------
3.1 项目规划-----------------------------------------
3.2 系统功能结构--------------------------------------
3.3 用例图设计-----------------------------------------
第四章 系统设计与实现-----------------------------------
4.1 设计目标-----------------------------------------
4.2 开发运行环境-------------------------------------
4.3 数据库设计-----------------------------------------
4.3.1 数据库表的概要-------------------------------
4.3.2 主要数据表结构-------------------------------
4.4 功能模块的实现------------------------------------
4.4.1文件架构---------------------------
4.4.2 登录和系统界面---------------------------
4.4.3 数据库连接---------------------------
4.4.3前台服务模块---------------------------
a 开台查看实现---------------------------
b点菜与签单实现---------------------------
c 自动结账实现---------------------------
第五章 总结-----------------------------------------
参考文献-----------------------------------------
第一章 系统概述
1.1 开发背景
随着计算机技术的飞速发展,信息时代的到来,信息改变了我们这个社会。各类行业在日常经营管理各个方面也在悄悄地走向规范化和网络化。酒店管理的信息化程度体现在将计算机及网络与信息技术应用于经营与管理,以现代化工具代替传统手工作业。无疑,使用网络信息化管理使酒店管理更先进、更高效、更科学,信息交流更迅速。
酒店管理系统是典型的信息管理系统的一部份,而且是必不可少的一部份。其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起简洁且资料一致性和完整性强、资料安全性好的数据库。而对于后者则要求应用程序功能完备,易使用等特点。
酒店管理系统是酒店经营管理中不可缺少的部分,它的内容对于经营的决策者和管理者来说都至关重要,所以客房管理系统、信息管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多弊端,如:效率低、保密性差,容易出现差错等,且对于查询维护等极为不方便。在当今时代,这些完全可以改用计算机来代替人的手工操作。
作为计算机及网络应用的一部分,使用计算机对客房信息进行管理,具有手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高客房经营管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。且办事效率也是决定收入的一个关键因素。
因此,我们组决定选择酒店管理系统作为本人的毕业设计,力求开发出一套界面友好,使用简单的适用于各中、小规模的酒店管理系统。
1.2 开发语言简介
Java语言其实最早是诞生于1991年, sun公司最初为一些消费性电子产品而设计的一个通用环境,后来逐步完善广泛应用与Internet,桌面系统等各个领域,在开发方面具有以下优势:
a:软件的需求分析:可将用户的需求进行动态的、可视化描述,以提供设计者更加直观的要求。而用户的需求是各色各样 的,不受地区、行业部门,爱好的影响,都可以用Java语言描述清楚。
b:软件的开发方法:由于Java语言的面向目标的特性, 所以完全可以用O-O的技术与方法来开发,这是符合最新的软件开发规范要求的 。
c:Java语言的动画效果远比GUI技术更加逼真,尤其是利用WWW提供的巨大动画资源空间,可以共享全世界的动态画面的 资源 。
软件产品用java语言开发的软件可以具有可视化,可听化 ,可操作化的效果,这要比电视,电影的效果更为理想,因 为它可以做到"即时、交互、动画与动作 ",要它停就停 ,要它继续就继续 ,而这是在电影与电视播放过程中难以做到 的。本系统在选择java语言原因之一它还具有其跨平台性,可移植性,安全性,健壮性。充分考虑跨系统平台和安全因素,这对于产品应用和市场化需求有很大作用。
1.3系统简介
现代化的酒店组织庞大、服务项目多、信息量大,要想提高劳动生产、降低成本、提高服务质量和管理水平,进而促进经济效益,必须借助计算机来进行现代化的信息管理。酒店管理系统正是为此而设计的。优秀的酒店客房管理系统操作方便,灵活性好,系统安全性高,运行稳定。这也是我所设计本程序的目的之一。本产品采用的C/S模式开发,主要考虑界面的友好性,且运行于客户端有效的降低服务器和客户端之间的运算量,节省了时间。本系统包括销售统计,后台管理,人员管理,初始化系统,和系统安全 五个模块。并与sql2005数据库应用相结合。
第二章 可行性分析
2.1 技术可行性
编写语言:采用Java语言进行编写。Java是一种安全的、稳定的、简单的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏 和模版,不允许多重继承)。Java操作简单和运行效率高,以其强大的操作能力、优雅的语法风格、创新的语言特性,编程的支持成为开发的首选语言。由于对Java技术比较熟练,对于系统较为简单的,但基本功能较为完善的酒店管理系统来说是基本没有问题的。
编程平台:编程平台采用myeclicps7.0.它已被证明是一个极其强大和成功的开发平台,其成熟稳定能够充分保证软件设计的顺利进行。
数据库:数据库采用微软的SQL Server 2005,虽然该数据库版本不是最新的,但其工作稳定,功能强大,资源耗费较少,所以能够充分满足目前的需要。
以上所用技术都是成熟的,先进的,稳定的。因此,开发本系统在技术上是可行的。
2.2 管理可行性
由于本系统功能比较简单,对于工作人员不存在太大难度。管理员权限明确,系统管理员拥有维护数据库系统的权限,对数据库中的数据进行添加、删除、更新等操作界面友好简单可操作性强。因此,本系统在管理上是可行的。
在本系统的运营阶段,使用系统的工作人员,除了需要具备在Windows平台上使用个人电脑的知识,并不需要特别的技术能力。
本系统充分结合实际酒店中餐饮营销方式,操作实际易于接受,适用性强 。在销售统计模块中分别对年,月,日销售模块进行全面统计,有利于改善优化管理服务。
2.3经济可行性
经济上主要考虑本系统带来的效益是否大于开发本系统的成本,采用自动化的信息管理减少了人员的使用,对信息进行充分统计,方便管理,为决策着进行更好决策做出依据,提高经济效益,由于本系统的开发以课程设计为依托,参与人员的目的以学习为主,投入成本比较小。另外,系统管理员和业务员都拥有计算机的专业知识,酒店前台工作人员和管理人员不需要经过培训即可操作本软件。这样可以为开发本系统节升资金。减少后期资源浪费。因此,开发本系统在经济是可行的。
综上所述,开发本系统,在经济上、技术上、管理上都是可行的。
7
第三章 系统需求分析
3.1 项目规划
通过项目组考察与调研,系统整理所有资料,并对这些资料从整体和局部进行分析,最后决定在本系统中包含如下6大功能模块。
l 前台服务:该模块主要包括开台点菜,维护菜品,签单,结账等功能,其中维护菜品功能包括添加和取消菜品,能够取消菜品的前提条件是尚未签单,即处于开单状态,结账时则要求所有商品都要签单,否则不允许结账。
l 后台管理:该模块主要包括台号管理,菜系管理和菜品管理功能,其中菜系用来对菜品进行分类。
l 销售统计:该模块主要用来分段统计营业额,可以按日,月,年进行统计,其中日统计是按照消费单和销售的商品统计销售额,月统计是按照日期和每日的销售额统计销售额,年统计是按照日期和月份统计销售额。
l 系统安全:该模块主要包括交接班,锁定系统和修改密码功能,其中交接班功能在操作员换岗时使用,锁定系统在操作员临时离开时使用。
l 人员管理:该模块主要包括档案管理,管理员管理和操作权限管理功能,其中管理员管理功能用来管理系统的操作员,权限管理功能用来管理系统操作员具有的操作权限。
l 初始化系统:该功能用来对系统进行初始化,初始化后系统数据将全部被删除。
3.2 系统功能结构
该介绍以超级管理员的角色从整理结构来介绍各个功能模块的使用方法。首先进入登录界面用超级管理员权限登录,超级管理员拥有后台管理,销售统计,系统安全,人员管理,前台管理,初始化系统权限,分别可以对管理员赋予各种权限,并且对台号,菜品种类进行设定分类,还可以进行销售统计和初始化系统(初始化后系统数据将被全部删除)。下图为整体功能
3.3 用例图设计
a:前台服务分析
开台点菜
前台服务员
维护菜品
签单
结账
菜系管理
b:后台管理分析管理员
台号管理
菜品管理
c:销售统计
管理员
日销售统计
月销售统计
年销售统计
d:系统安全
管理员
交接班
锁定系统
修改密码
e:人员管理
高级管理员
操作权限管理
档案管理
管理员管理
f:初始系统化
管理员
初始化系统
第四章 系统设计与实现
4.1设计目标
根据餐饮行业的特点和实际情况,本系统以餐饮业务为基础,突出前台管理,重视营业数据分析等功能,从专业角度出发,努力为餐饮管理者提供科学有效的管理模式和数据分析功能。力求开发出一款简单,使用的酒店管理系统,令其适合于众多餐饮企业的需求,同时该系统还要具有一定的人性化和智能化的特点,以保证软件有易学易用的特点,界面设计还要简介大方,以便常用功能的操作。
4.2开发运行环境
本系统运行时需要以下条件。
硬件平台:
l cpu:pentium 41.8GHz
l 内存:256MB以上
l 操作系统:windows xp/windows 2000/windows 2003/windows 7
l 数据库:Sql Server 2005
l 开发工具包:JDK Version1.6
4.3数据库的设计
本系统的底层数据库采用的sql server2005数据库,系统数据库名称为db_DrinkeryManage。在数据库中共包含7个数据库表和三个视图。下面是对各表的概要说明及具体及结构。
4.3.1 数据库表的概要
该树形结构图显示了数据库系统的所有数据表。
4.3.2 主要数据表结构
l tb_desk台号表,用于保存餐台信息,表结构如下所示
l tb_sort 菜系表 用于保存菜系信息,表结构如下所示
l tb_menu菜品表,用于保存菜品信息,表结构如下所示
l tb_record 档案表,用于保存档案信息,表结构如下所示
l tb_manager管理员表,用于保存系统管理员信息,表结构如下所示
l tb_order_form消费单表用于保存消费单信息,表结构如下所示
l tb_order_item消费项目表用于保存每个消费单具体包含的消费项目信息,表结构如下所示
4.4功能模块的实现
系统根据酒店管理中餐饮行业的特点,共有六个模块组成,在此本人将以前台服务模块为例,详细的阐述系统实现的主要思想,和设计逻辑,
4.4.1文件架构
l 写代码之前,通常将系统的文件夹架构做一整体规划,主要目的对文件进行分类管理,以便在开发和维护中迅速查找,同时也对系统起到分层作用
l 以文件架构为基础,整体设计出功能架构图,如下所示。
4.4.2 登录和系统界面
l 采用swing技术设计出登陆窗体,主要有登录名框,密码框,和两个按钮组成,界面友好简洁,
l 系统主窗体设计以容器,面板方式嵌套组合,主要本着简单易懂,界面友好为原则,充分体现操作性实用性的特点。
4.4.3 数据库连接
采用myeclicps和sqlserver2005的连接方式,在使用数据库之前应注意以下问题,安装数据库驱动应为1.2版本以上,而且要确保TCP/IP端口协议开启。
创建5个私有静态变量加载和连接数据库,其中threadlocal用来保存已经创建的数据库连接。
private static final String DRIVERCLASS = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=db_DrinkeryManage";
private static final String USERNAME = "sa";
private static final String PASSWORD = "sa";
此处为加载数据库驱动:
private static final ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
static {// 在静态代码块中加载数据库驱动
try {
Class.forName(DRIVERCLASS).newInstance();// 加载数据库驱动
} catch (Exception e) {
e.printStackTrace();}}
此处连接数据库方法:
public static Connection getConnection() {// 创建数据库连接的方法
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 boolean closeConnection() {// 关闭数据库连接的方法
boolean isClosed = true;// 默认关闭成功
Connection conn = threadLocal.get();// 从线程中获得数据库连接
if (conn != null) {// 数据库连接可用
threadLocal.set(null);// 清空线程中的数据库连接
try {
conn.close();// 关闭数据库连接
} catch (SQLException e) {
isClosed = false;// 关闭失败
e.printStackTrace();
}
}
return isClosed;// 返回关闭结果
}
4.4.3前台服务模块
前台服务模块主要分为,开台签单,点菜签单,自动结账功能,以人性化,简易化为原则,增加了系统的可操作性,例如,开台点菜功能中有助记码可方便前台进行快捷输入菜品名称,如红烧肉助记码为hsr,输入一个或全部字母即可出来菜品名。用自动结帐功能系统可自动显示应付金额和要找金额。从而避免因忙碌和繁杂的事物和数据造成的过失。
a 开台查看实现
在客户需要服务时选中所开台号,然后点开单即可进行点菜等服务操作,主窗体上部显示签单列表,开台列表,分别对台号,和账单进行显示,在主界面中图示如下
当在“台号”下拉框中选中已经开台的台号时,开台列表中该台号所在的行也将被选中,同时在签单列表中将列出该餐台消费的所有项目,效果如上图所示。
如果在“台号”下拉框中选中尚未开台的台号时,在开台列表中将不选中任何行,并且在签单列表中将没有任何项目,
实现“台号”代码如下:
final JLabel numLabel = new JLabel(); // 创建“台号”标签
numLabel.setText("台号:"); // 设置标签文本
orderDishesPanel.add(numLabel);
numComboBox = new JComboBox(); // 创建台号选择框
numComboBox.setNextFocusableComponent(codeTextField); // 设置下一个将要获得焦点的组件
initNumComboBox(); // 初始化台号选择框
numComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int rowCount = rightTable.getRowCount(); // 获得已开台数
if (rowCount == 0) // 没有开台
return; // 不执行任何操作
Object selectedDeskNum = numComboBox.getSelectedItem(); // 获得“台号”选择框中的选中项
int needSelectedRow = -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); // 选中“签单列表”中的第一行
}
}
b 点菜与签单实现
选中要点的餐台后即可进行点菜,系统支持两种方式点菜:一种是通过菜品的 记助码,这种样式的优点在于快速获取菜品名称,另一种方式通过菜品的编号输入后自动显示菜品名到商品名称框里。
其系统图中显示如下所示
获取菜品功能是通过文本框添加键盘事件监听器实现的,代码如下:
codeTextField.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {// 通过键盘监听器实现控制文本框的输入内容
if ("abcdefghijklmnopqrstuvwxyz0123456789".indexOf(e
.getKeyChar()) < 0)// 只允许输入字母和数字
e.consume();// 销毁此次键盘事件
}
public void keyReleased(KeyEvent e) {// 通过键盘监听器实现智能获取菜品
if (e.getKeyCode() == KeyEvent.VK_ENTER) {// 按下回车键
makeOutAnInvoice();// 开单
} else {
String input = codeTextField.getText();// 获得输入内容
Vector menuV = null;// 符合条件的菜品
if (input.length() > 0) {// 确认输入了内容
if (codeRadioButton.isSelected()) {// 按助记码查询
Vector menusV = dao.sMenuByCode(input);// 查询符合条件的菜品
if (menusV.size() > 0) {// 存在符合条件的菜品
menuV = (Vector) menusV.get(0);// 获得第一个符合条件的菜品
menuV.remove(0);// 移除菜品的序号
}
} else {// 按编号查询
if (input.length() == 9)// 确认编号是否为9位
menuV = dao.sMenuByNum(input);// 查询符合条件的菜品
}
}
if (menuV == null) {// 不存在符合条件的菜品
nameTextField.setText(null);// 设置“商品名称”文本框为空
unitTextField.setText(null);// 设置“单位”文本框为空
priceTextField.setText(null);// 设置“单价”文本框为空
} else {// 存在符合条件的菜品
nameTextField.setText(menuV.get(2).toString());// 设置“商品名称”文本框为符合条件的菜品名称
unitTextField.setText(menuV.get(4).toString());// 设置“单位”文本框为符合条件的菜品单位
priceTextField.setText(menuV.get(5).toString());// 设置“单价”文本框为符合条件的菜品单价
}
}
}
});
orderDishesPanel.add(codeTextField);
注解:
consume():该方法用于销毁此次事件,如果此次事件是向一个文本框中输入一个字符,则取消次输入。
e,getKeyCode()==KeyEventVK_ENTER:该段代码用来判断此处事件是用户按下Enter键触发的,如果是则返回true;否则返回false。
默认情况下点才数量为1,如果不需要修改点菜数量,通过菜品助记码或编号获得菜品后直接单击回车就开单成功从而方面用户操作。
确定多点菜品和数量后,也可以通过单击“开单“按钮完成开单工作,签单列表中的新开单菜品前会有一个“NEW”标记,
确定消费“签单列表”中所有菜品后,需要单击“签单“按钮取消所有菜品前所有菜品的“NEW”标记实现“签单”。
c自动结账实现
该功能自动计算“签单列表“中消费金额,在“实收金额”文本框中输入已收金额,系统自动计算应找金额,避免因忙碌繁杂而引起的错误结算。
在结账之前一定要确保所有菜品已经签单,否则将弹出提示信息,并且要保证实收金额不小于消费金额。实现结账代码如下:
final JButton checkOutButton = new JButton();
checkOutButton.setText("结 账");
checkOutButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int selectedRow = rightTable.getSelectedRow();
if (selectedRow < 0) {// 未选中任何餐台
JOptionPane.showMessageDialog(null, "请选择要结账的餐台!", "友情提示",
JOptionPane.INFORMATION_MESSAGE);// 弹出提示
return;
}
int rowCount = leftTable.getRowCount();// 获得结账餐台的点菜数量
if (leftTable.getValueAt(rowCount - 1, 0).equals("NEW")) {// 存在未签单菜品
JOptionPane.showMessageDialog(null, "请先确定未签单商品的处理方式!",
"友情提示", JOptionPane.INFORMATION_MESSAGE);// 弹出提示
return;
}
int expenditure = Integer.valueOf(expenditureTextField
.getText());// 获得消费金额
int realWages = 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.set
展开阅读全文