1、计算机软件学专业课程设计报告书课程名称 SQL server 2000 课程设计题目 客房管理系统1 概述1.1 背景客房管理是旅店管理事务中的一项重要工作,在管理过程中涉及到大量的数据处理,传统的人工管理已经无法完成胜任。相关数据的处理带来了更大的工作量。 本系统采用目前比较流行的JDBC-ODBC数据访问技术,成功地将面向对象的程序设计思想应用到数据库应用程序设计中。1.2 开发与运行环境本客房管理系统的开发与运行环境如下:开发环境:Eclipse 3.1开发工具:JAVA 1.5数据库管理系统:SQL Server 2000运行环境:Windows 2000/XP/2003/Vista使
2、用说明:用户自己附加数据库,并且在控制面板下的数据工具中的数据源(ODBC),在用户DSN下添加名为“客房管理”,驱动程序为SQL-Server。并且安装了JAVA虚拟机,该程序即可使用。2 需求分析客房资管理系统涉及到:客人信息、客房信息、入住信息、历史信息等多种数据信息。客房管理系统的用户包括系统管理员。系统管理员负责整理工作,如各种基本信息的添加、删除和简单的结账计算等操作。本系统的主要功能包括:客人信息管理:客人信息数据的添加、删除、结账计算。数据查询:查看客人信息数据,查看客房信息数据。数据统计:统计一段时间内的客房情况和月收入等基本统计。3 系统设计3.1 系统模块设计根据系统功能
3、分析和一些旅店客房管理的特点,经过模块化的分析得到如下图所示的系统功能模块结构图。客房管理登记功能统计功能查询功能已入住客房查寻空房查询按名字查询客人信息按客人编号查询客人信息添加客人信息删除客人信息统计入住情况统计入住率统计收入安全管理模块用户名和密码登陆注销系统功能模块结构图3.2 数据库设计3.2.1 数据流图顶层数据流图第0层数据流图3.2.2 数据字典根据系统功能模块结构图及典型旅店客房管理系统的需求,总结出来如下的数据字典:(1)数据项说明数据项名称含义说明类型长度记录编号惟一标识一条记录bigint8客房编号惟一标识一间客房varchar10离店时间标识离店时间datetime8
4、金额标识所收金额money8类别标识客房类别smallint2名称标识客房类别名称varchar20价格标识客房价格money8(2)数据流说明数据流名称含义来源去向组成登陆管理员进入系统操作客房管理系统管理员端编号+密码查询已住房查询住房资料客人信息表统计界面客人信息表+客房编号表查询空房查询空住房客房编号表统计界面客房编号表查询房号查询房号信息客人信息表统计界面客人信息表计算计算金额客房管理系统管理员端客房管理系统登记,删除录入住房信息管理员端客房管理系统系统数据库统计统计住房信息系统数据库统计界面系统数据库(3)数据存储说明数据存储名称含义说明组成结构历史记录表存放客房历史的有关信息客房
5、编号+金额客人信息表存放客人相关的信息个人信息+住店时间+金额客房类别表存放客房对应的价格类别+价格客房编号表存放客房对应的编号类别+编号管理人员表存放管理员验证信息编号+密码(4)处理过程说明处理过程名称:审核登陆输入:编号+密码输出:确认加工逻辑:根据编号和密码管理员,进入主窗体。(其他处理过程略)3.2.3 概念结构设计依据客房管理系统的实际情况,考虑了多方面的因素以后,确定系统的E-R图,如图所示:客房管理系统E-R图3.2.4 逻辑结构设计按照E-R图转换规则,可以得到如下的关系模式:客人信息(客房编号,姓名,性别,年龄,身份证号码,家庭住址,工作单位,来自地的地名,预定入住时间,入
6、住时间,离店时间,押金,需负金额)客人类别(类别,名称,价格)客房编号(编号,类别)历史记录(记录编号,客房编号,离店时间,金额)管理人员(编号,密码)3.2.5 物理结构设计根据E-R图及数据字典,设计出公司工资管理系统数据库中的各个数据表,包括:客人信息、客房类别、客房编号、历史记录、管理人员共5个数据表。本系统数据库命名为“客房管理系统”,数据库中的各个数据表名称和结构分别如下所示,为便于说明,各个数据表的结构使用该表在SQL Server企业管理器中的设计视图表示。l 关系图:l 客人信息:客人信息结构图l 客房类别:客房类别结构图l 客房编号:客房编号结构图l 历史记录:历史记录结构
7、图l 管理人员:管理人员结构图4 详细设计4.1 界面设计主窗口(Mainwindow)本窗体为主窗体,用到java的swing中的菜单栏组件,主要代码如下:panel1=new JPanel();this.setContentPane(panel1);lbPicture=newJLabel(new ImageIcon(管理系统.Mainwindow.class.getResource(背景.jpg);panel1.add(lbPicture);/主菜单jmbMain=new JMenuBar();jmSystem=new JMenu(系统);jmSearch=new JMenu(查询);jm
8、Add=new JMenu(登记);jmCount=new JMenu(统计);jmHelp=new JMenu(帮助);setJMenuBar(jmbMain);/添加主菜单jmbMain.add(jmSystem);jmbMain.add(jmSearch);jmbMain.add(jmAdd);jmbMain.add(jmCount);jmbMain.add(jmHelp);/系统子菜单jmiLogin=new JMenuItem(登陆);jmiLogin.addActionListener(this);jmSystem.add(jmiLogin);jmiCancel=new JMenu
9、Item(注销);jmiCancel.addActionListener(this);jmiCancel.setEnabled(false);jmSystem.add(jmiCancel);jmiExit=new JMenuItem(退出);jmiExit.addActionListener(this);jmSystem.add(jmiExit);/查询子菜单jmiSearchFullRoom=new JMenuItem(查已住房);jmiSearchFullRoom.addActionListener(this);jmiSearchFullRoom.setEnabled(false);jmS
10、earch.add(jmiSearchFullRoom);jmiSearchVoidRoom=new JMenuItem(查空房);jmiSearchVoidRoom.addActionListener(this);jmiSearchVoidRoom.setEnabled(false);jmSearch.add(jmiSearchVoidRoom);jmiSearchName=new JMenuItem(按名字或房号查);jmiSearchName.addActionListener(this);jmiSearchName.setEnabled(false);jmSearch.add(jmiS
11、earchName);jmiLine.setEnabled(false);jmSearch.add(jmiLine);jmiCalculate=new JMenuItem(结账);jmiCalculate.addActionListener(this);jmiCalculate.setEnabled(false);jmSearch.add(jmiCalculate);/登记子菜单jmiAdd=new JMenuItem(添加);jmiAdd.addActionListener(this);jmiAdd.setEnabled(false);jmAdd.add(jmiAdd);jmiDelete=
12、new JMenuItem(删除);jmiDelete.addActionListener(this);jmiDelete.setEnabled(false);jmAdd.add(jmiDelete);/统计子菜单jmiCircumstances=new JMenuItem(入住情况);jmiCircumstances.addActionListener(this);jmiCircumstances.setEnabled(false);jmCount.add(jmiCircumstances);jmiRate=new JMenuItem(入住率);jmiRate.addActionListen
13、er(this);jmiRate.setEnabled(false);jmCount.add(jmiRate);jmiIncome=new JMenuItem(收入);jmiIncome.addActionListener(this);jmiIncome.setEnabled(false);jmCount.add(jmiIncome);/帮助子菜单jmiAbout=new JMenuItem(关于);jmiAbout.addActionListener(this);jmHelp.add(jmiAbout);/窗体属性setBounds(300,150,800,600);setVisible(t
14、rue);菜单中的键用到了ActionListener接口来实现 主要代码如下:public void actionPerformed(ActionEvent ae)/退出键if (ae.getSource()=jmiExit)/登陆键else if(ae.getActionCommand()=登陆)/注销键else if(ae.getSource()=jmiCancel)/查已住房间键else if(ae.getSource()=jmiSearchFullRoom)/查空房else if(ae.getSource()=jmiSearchVoidRoom)/按名字或房号查else if(ae.
15、getSource()=jmiSearchName)/结账else if(ae.getSource()=jmiCalculate)/添加else if(ae.getSource()=jmiAdd)/删除else if(ae.getSource()=jmiDelete)/入住情况else if(ae.getSource()=jmiCircumstances)/入住率else if(ae.getSource()=jmiRate)/收入else if(ae.getSource()=jmiIncome)/关于else if(ae.getSource()=jmiAbout)登陆界面(Login)本窗体连
16、接到数据库中的管理员表通过定义ResultSet来调用表中的数据,相关代码: ResultSet rs; rs=stat.executeQuery(select * from 管理人员 where 编号=+tUser.getText()+ and 密码=+password.getText()+);判断成功后实现主窗体中子菜单的setEnable()方法。登记客人信息(Add)本窗体主要用到T-SQL语句中的insert into. VALUES语句,相关代码:a1=+tName.getText().trim()+;a2=+tSex.getText().trim()+;a3=+tAge.getT
17、ext().trim()+;a4=+tIdentication.getText().trim()+;a5=+tAddress.getText().trim()+;a6=+tWorkPlace.getText().trim()+;a7=+tFrom.getText().trim()+;a8=+tRoomNo.getText().trim()+;a9=+tWillIn.getText().trim()+;a10=+tIn.getText().trim()+;a11=+tLeave.getText().trim()+;int i = Integer.valueOf(tCash.getText().i
18、ntValue();String b=insert into 客人信息 (客房编号,姓名,性别,年龄,身份证号码,家庭住址,工作单位,来自地的地名,预定入住时间,入住时间,离店时间,押金) VALUES (+a8+,+a1+,+a2+,+a3+,+a4+,+a5+,+a6+,+a7+,+a9+,+a10+,+a11+,+i+);stat=conn.prepareStatement(b);r=stat.executeUpdate();删除客人信息(Delete)删除窗体与添加窗体相类似,用到T-SQL中的delete语句。客人结账(Calculate)本窗体用到的T-SQL语句有(1)updat
19、e 金额_viewset 需负金额=datediff(day,入住时间,getdate()*价格-押金where 客房编号=501(2)update 金额_viewset 离店时间=dateadd(day,datediff(day,入住时间,getdate(),入住时间)where 客房编号=501(3)select 客房编号,姓名,需负金额from 金额_viewwhere 客房编号=501 -(前台应用改客房编号就可以了)在前台定义stat=con.createStatement()再用stat.executeUpdate(1);stat.executeUpdate(2);rs=stat.
20、executeQuery(3);来实现。查询客人信息(SearchForName)本窗体主要用到JTable和连接客人信息表,相关代码:stat=conn.createStatement();rs=stat.executeQuery(select 姓名,性别,工作单位,客房编号,入住时间 from 客人信息 where 姓名=+tName.getText()+);rs=stat.executeQuery(select 姓名,性别,工作单位,客房编号,入住时间 from 客人信息 where 客房编号=+tName.getText()+);查询空房(VoidRoom)本窗体用到的T-SQL语句有
21、:select distinct 名称,编号from 客房编号join 客房类别on 客房类别.类别=客房编号.类别where 编号 not in(select distinct 编号from 客房编号join 客人信息on 编号=客人信息.客房编号where 编号=客人信息.客房编号 and 离店时间 is null)与前台连接的相关语句有:stat=conn.createStatement();rs=stat.executeQuery(select distinct 类别,编号 from 客房编号 where 编号 not in (select distinct 编号 as 已定或已住 f
22、rom 客房编号 join 客人信息 on 编号=客人信息.客房编号 where 编号=客人信息.客房编号 and 离店时间 is null);查询已住或已定的客房(FullRoom)本窗体用到的T-SQL有:select distinct 名称,编号from 客房编号join 客人信息on 编号=客人信息.客房编号join 客房类别on 客房类别.类别=客房编号.类别where 编号=客人信息.客房编号 and 离店时间 is null与前台连接的相关代码:stat=conn.createStatement();rs=stat.executeQuery(select distinct 类别,
23、编号 from 客房编号 join 客人信息 on 编号=客人信息.客房编号 where 编号=客人信息.客房编号 and 离店时间 is null);统计月收入(InCome)本窗体用到的T-SQL语句:select month(离店时间) as 月份,sum(金额) as 收入from 历史记录join 客房编号on 客房编号=编号where year(离店时间)=2008group by month(离店时间)与前台连接的相关语句有:stat=con.createStatement();rs=stat.executeQuery(select month(离店时间) as 月份,sum(金
24、额) as 收入 from 历史记录 join 客房编号 on 客房编号=编号 where year(离店时间)=+tYear.getText()+ group by month(离店时间);统计一段时间内各客房入住率(Rate)本窗体用到的T-SQL语句有:select 客房编号,cast(cast(count(*) as float)/(select count(*) from 历史记录)*100.00 as varchar)+% as 入住率from 历史记录where 2008-1-1=离店时间 and 离店时间=+tStart.getText()+ and 离店时间=+tOver.g
25、etText()+ group by 客房编号);统计一段时间内各类客房的入住情况(StatisticsInto)本窗体用到的T-SQL语句有:select 名称,cast(cast(count(*) as real)/(select count(*) from 历史记录)*100.00 as varchar)+% as 入住率,sum(金额) as 收入金额from 历史记录join 客房编号on 客房编号=编号join 客房类别on 客房类别.类别=客房编号.类别where 2008-1-1=离店时间 and 离店时间=+tStart.getText()+ and 离店时间=+tOver.
26、getText()+ group by 名称);4.2 代码设计l -建立客房管理数据库(使用默认设置)create database 客房管理系统-创建客人信息表create table 客人信息(客房编号 varchar(10) primary key,姓名 varchar(10) not null,性别 char(2) not null,年龄 tinyint,身份证号码 varchar(20) not null,家庭住址 varchar(50) not null,工作单位varchar(50) not null,来自地的地名varchar(50) not null预定入住时间 dateti