1、第一章 绪论1.1 选题背景随着中国经济的腾飞,人民生活水平的不断进步,旅游已经成为当今人们生活、娱乐、休闲的一个主题。旅游行业的日趋火爆,同时加速了宾馆行业的整体发展。宾馆行业充满了激烈的市场竞争,在改革开放一来,我国的宾馆行业迅速发展,成为具有一定规模的第三产业,充满了广阔的市场前景和拥有良好的发展趋势。在未使用计算机软件对宾馆客房采用传统的管理方式时,通常使用手工处理账务,存在去多现金流失的漏洞,且人工查房不能及时、准确的获得房间是否处于空闲或者被预定状态的信息。相反的,如借助计算机系统,可是结账既准确又快速,并能在第一时间得知房间的状态信息。因此,要想使宾馆的工作质量和效率提高,采用先
2、进的计算机网络和通信技术改变酒店业务模式,实现酒店业务管理的自动化已经成为一种必然。1.2研究现状国外的酒店管理系统最早是于70年代初发展起来的,到了80年代,国外的酒店管理系统,如EECO(Electronic Engineering CO.)、HIS(Hotel Information System)、CLS、Lodgistix等,整个模式已基本定型,技术较成熟,功能也较齐全。现在,国外酒店正向个性化方向发展,酒店按其经营方式可分为商务型酒店、长住型酒店、度假型酒店等等;按其经营形式可分为独立经营饭店、集团经营饭店等。而且产生了一大批国际级的联号饭店,如希尔顿(Hilton Hotels
3、Corp)、谢拉顿(Sheraton Corp)、假日(Holiday Corp)、凯悦(Hyatt Hotel Corp)等集团公司的世界饭店。国内的宾馆计算机管理系统于上世纪80年代初起步,到了80年代中后期,随着国外宾馆计算机系统和先进管理技术的大规模引进,进一步促进了我国宾馆管理技术的发展。国内宾馆管理系统正是在充分吸收国外管理系统的精华,结合国内实际的情况下逐步发展成熟,到90年代初期形成了几个较成熟的软件系统,同时产生了许多专职从事宾馆计算机管理系统的公司。到了90年代中期,随着计算机在饭店中的普及应用,以及计算机技术的不断发展,宾馆计算机系统的发展到了一个新的时期,新的系统平台、
4、新的软件功能、新的系统特点及发展方向不断涌现。国内最早的宾馆管理软件仅简单运用于前台接待、排房、结帐、查询等基本服务,发展至今,较为成熟的宾馆管理系统已具备前台管理、餐饮娱乐管理、客户管理、财务管理、物业管理等多项管理功能。综上所述我国宾馆管理软件的功能发展有如下几大趋势:(1). 软件产品集成化(2). 操作界面人性化(3). 注重客户关系管理(4). 从数据处理型向决策型发展(5). 系统开放化(6). 增值产品/服务功能增加(7). 支持电子商务(8). 宾馆集团型管理软件1.3项目意义随着世界经济全球化进程的加快,在这个信息“爆炸”的电子商务时代,掌握了信息技术的主动权,便率先拥有了商
5、机。因为互联网具有开放性、国际性等特点,使得旅游宾馆的经营范围扩展到全球,同时电子商务又扩大了宾馆业的竞争领域,使企业从常规的广告竞争,促销手段,产品设计等领域的竞争扩大到无形的虚拟竞争空间。宾馆管理系统是酒店对自身管理不可缺少的一部分,利用该计算机系统可以对酒店规模、制度、政策的进一步拓展、优化提供便利,还可以提高工作效率和经济效益,使得管理更有条理、更加科学、规范。可以预见,宾馆管理系统的实现将在很大的程度上改善宾馆的管理运行机制,提高宾馆的办公效率,为高质量宾馆服务提供保证。并且准确、快速、统一的信息处理对宾馆的决策、业务发展和社会信誉必定有着积极的意义。第二章 需求分析2.1功能需求分
6、析具体功能的详细描述如下1.客房类型管理2.客房管理3.客房查询4.客户入住5.客户结算6.用户管理7.系统帮助8.退出系统2.2数据流需求分析: 登陆信息 返回信息 用 户登 录操 作数据库 错误信息 寻找信息 2-2-1数据库需求分析数据流图第三章 概要设计3.1系统功能概述图登陆 客户类型管理客 户 查 询客 户 入 住客 户 结 算系 统 帮 助客 房 管 理用 户 管 理退 出 系 统3.2 Client信息E-R图:ClientClientIDNativePlaceClientNameSex3.3 ClientBookIn信息E-R图ClientBookInBookInDateRo
7、omIDCheckDateTotalMoneyClientIDRemark3.4管理员用户E-R图UserID UserUserPasswordUserSortRemark3.5客房信息E-R图Room RoomIDRoomPostionPeopleNumFactPeopleNum BedNumRoomTypeNameRemark3.6客房类型信息E-R图 RoomType AreaPriceAirConditionPhone BedNumRoomTypeNameToiletTelevisionPeopleNum第四章 数据库的表的建立与实现Client表的建立:ClientBookIn表的建
8、立:Room表的建立:RoomType表的建立:User表的建立:第五章 详细设计5.1用户登录功能建立一个窗口,从公共控件中添加label,button控件到窗口,编辑按钮程序,插入图片;连接数据库User表对管理员输入的信息进行验证,判断是否可以通过;调用getNumber()函数随机生成验证码,保证安全性。关于验证码,每次调用getNumber()函数都会生成一个新的验证码,应当把验证码保存到Session中需要比较时再拿出来,注意验证码不分大小写。相关运行截图如下: 5-1-1 登陆界面5-1-2 登录验证5-1-3 登陆出错5-1-4 登陆成功5.2 客房类型管理功能 建立一个窗口,
9、从公共控件中添加label,button,textbox,GirdView等控件到窗口,编辑按钮程序,插入图片;GirdView需要配置数据源,对数据库中的内容进行显示对客房类型的的信息进行编辑,包括类型(普通,贫民,豪华) 客房面积(30,60,90) 额定床数(1,2,3,4) 额定人数(1,2,3,4) 价钱(50,500) 电视(有,无)电话(有,无) 空调(有,无) 卫生间(有,无)这些属性,对客房类型进行增删改查功能操作。关于GirdView控件事件的说明被单击时发生。它们分别在网格控件处理分页操作之前和之后激发。RowCancelingEdit 在一个处于编辑模式的行的Cance
10、l按钮被单击,但是在该行退出编辑模式之前发生。RowCommand单击一个按钮时发生。RowCreated创建一行时发生。 RowDataBound一个数据行绑定到数据时发生。RowDeleting, RowDeleted 这两个事件都是在一行的Delete按钮被单击时发生。它们分别在该网格控件删除该行之前和之后激发。RowEditing 当一行的Edit按钮被单击时,但是在该控件进入编辑模式之前发生。RowUpdating,RowUpdated 这两个事件都是在一行的Update按钮被单击时发生。它们分别在该网格控件更新该行之前和之后激发。SelectedIndexChanging, Sel
11、ectedIndexChanged这两个事件都是在一行的Select按钮被单击时发生。它们分别在该网格控件处理选择操作之前和之后激发。 Sorting, Sorted这两个事件都是在对一个列进行排序的超链接被单击时发生。它们分别在网格控件处理排序操作之前和之后激发相关运行截图如下:5-2-1 客房类型管理界面 5-2-2 客房类型管理添加功能界面5.3 客房管理功能建立一个窗口,从公共控件中添加label,button,textbox,GirdView等控件到窗口,编辑按钮程序,插入图片;GirdView需要配置数据源,对数据库中的内容进行显示对客房的的信息进行编辑,包括房间号码 客房面积(3
12、0,60,90) 额定人数(1,2,3,4) 房间楼层(一楼,二楼,三楼 ) 额定床数这些属性,对客房进行增删改查等功能操作。关于ListBox控件首先来说控件的属性,(1)Items:使用此属性获取列表控件项的属性。此属性可用于确定列表控件中的选定项。添加items时既可以设计时静态添加,也可以在代码中动态添加。如果不想显示设计时添加的items,可以在代码中添加this.listBox1.Items.Clear();只显示在代码中添加的选项。(2)SelectedItems:获取包含ListBox中当前选定项的集合。(3)SelectioModes:获取或设置在ListBox中选择项所用的
13、方法。一共有 四个值可选;默认为:SelectionMode.One,只能选中一个;属性值为none时不能选择;当属性MultiExtended 时,按下 Shift 键的同时单击鼠标或者同时Shift 键和箭头键之一(向上键、向下键、向左键和向右键),会将选定内容从前一选定项扩展到当前项。按 Ctrl 键的同时单击鼠标将选择或撤消选择列表中的某项;当该属性设置为MultiSimple 时,鼠标单击或按空格键将选择或撤消选择列表中的某项。接下来说一哈数据绑定,通常数据都是可变的,所以说就需要数据绑定。数据绑定有几种,一种就是绑定从数据库中获取的DataTable或者是DataSet;另外一种就
14、是自定义一个类,绑定自定义类中的数据。c#中的数据绑定与ASP.NET中的数据绑定还有一点区别,ASP.NET中绑定数据后还要调用一个DataBind方法,而在c#中就不需要。而DisplayMember获取或设置要显示的属性。相关运行截图如下 5-3-1 客房类型管理添加功能界面5.4客房查询与客户入住功能建立一个窗口,从公共控件中添加label,button,textbox,listbox,GirdView等控件到窗口,编辑按钮程序,插入图片;GirdView需要配置数据源,对数据库中的内容进行显示输入查询条件,包括的属性有房间号码 房间类型 房间楼底 额定床数 额定人数 实际人数 其他条
15、件,与数据库的数据进行比对,查找该客房信息。数据库提供房间的信息,根据住户需求,判断用户是否入住;若选择入住,则进行登记,跳转到客户入住界面。客户入住的功能实现与客房查询基本相似,客户入住是对住户的基本信息进行记录。将客户的基本信息包括身份账号,姓名,性别,籍贯,以及入住的时间,关于入住时间这里要添加一个日历的控件是一个传统的单月份日历,用户可以使用该日历查看和选择日期。Calendar控件提供的功能:1、显示一个日历,该日历会显示一个月份2、允许用户选择日期、周、日。3、允许用户选择一定范围内的日期。4、允许用户移到下一月或上一月。5、已编程的方式控件选定日期的显示。相关运行截图如下 5-4
16、-1 客房查询界面 5-4-2 客户入住界面5.5 客户查询和客户结算功能建立一个窗口,从公共控件中添加label,button,textbox,listbox,GirdView等控件到窗口,编辑按钮程序,插入图片;GirdView需要配置数据源,输入身份证号和姓名,从数据库中查找客户;点击结账按钮,确认用户是否结账,入已经结账则显示确认的信息;若在住的人选择结账,即跳转到客户结算界面 ,输入应收金额,确认是否对住户打折,这里面包括VIP等节假日的因素不便多说,点击结账按钮确认用户结账相关运行截图如下5-5-1 客户查询界面5-5-2 已经结账的客户界面5-5-3 需要结账的用户界面5-5-4
17、 客户结算界面5-5-5 已结算客户界面5-6 用户管理功能建立一个窗口,从公共控件中添加label,button,textbox,listbox,GirdView等控件到窗口,编辑按钮程序,插入图片;GirdView需要配置数据源,编辑新用户信息,添加新的管理员,进行保存,新建立的用户将添加到数据库中,可以使用新用户进行登录相关运行截图如下 5-6-1 用户管理功能界面小 结 时间非常快就过去了,这两个星期不敢说自己有多大的进步,获得了多少知识,但起码是了解了项目开发的部分过程。虽说上过数据库上过管理信息系统等相关的课程,但是没有亲身经历过相关的设计工作细节。这次实习证实提供了一个很好的机会
18、。 通过这次课程设计发现这其中需要的很多知识我们没有接触过,去图书馆查资料的时候发现我们前边所学到的仅仅是皮毛,还有很多需要我们掌握的东西我们根本不知道。同时也发现有很多已经学过的东西我们没有理解到位,不能灵活运用于实际,不能很好的用来解决问题,这就需要我们不断的大量的实践,通过不断的自学,不断地发现问题,思考问题,进而解决问题。在这个过程中我们将深刻理解所学知识,同时也可以学到不少很实用的东西。 从各种文档的阅读到开始的需求分析、概念结构设计、逻辑结构设计、物理结构设计。亲身体验了一回系统的设计开发过程。很多东西书上写的很清楚,貌似看着也很简单,思路非常清晰。但真正需要自己想办法去设计一个系
19、统的时候才发现其中的难度。经常做到后面突然就发现自己一开始的设计有问题,然后又回去翻工,在各种反复中不断完善自己的想法。 我想有这样的问题不止我一个,事后想想是一开始着手做的时候下手过于轻快,或者说是根本不了解自己要做的这个系统是给谁用的。因为没有事先做过仔细的用户调查,不知道整个业务的流程,也不知道用户需要什么功能就忙着开发,这是作为设计开发人员需要特别警惕避免的,不然会给后来的工作带来很大的麻烦,甚至可能会需要全盘推倒重来。所以以后的课程设计要特别注意这一块的设计。 按照要求,我们做的是宾馆管理。说实话,我对这个是一无所知的,么一个流程。盲目开始设计的下场我已经尝过了,结果就是出来一个四不
20、像的设计方案,没有什么实际用处。没有前期的调查,仅从指导书上那几条要求着手是不够的。 在需求分析过程中,我通过上网查资料,去图书馆查阅相关资料,结合我们的生活经验,根据可行性研究的结果和客户的要求,分析现有情况及问题,由于忘记了一些C#语言的规范使得在调试过程中一些错误没有发现,通过这次课程设计,我对调试掌握得更加熟练了,意识到了程序语言的规范性以及我们在编程时要有严谨的态度,同时在写程序时如有一定量的注释,既增加了程序的可读性,也可以使自己在读程序时更容易。 我们学习并应用了SQL语言,对数据库的创建、修改、删除方法有了一定的了解,通过导入表和删除表、更改表学会了对于表的一些操作,为了建立一
21、个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程,为毕业设计打下基础。 很多事情不是想象中的那么简单的,它涉及到的各种实体、属性、数据流程、数据处理等等。很多时候感觉后面的设计根本无法继续,感觉像是被前面做的各种图限制了。在做关系模型转换的时候碰到有些实体即可以认为是实体又可以作为属性,为了避免冗余,尽量按照属性处理了。 物理结构设计基本没有碰到问题,这一块和安全性、完整性不觉就会在物理结构设计中添加一些安全设置:主键约束、check约束、default定义等。最后才做索引的部分,对一些比较经常使用搜索的列,外键上建立索
22、引,这样可以明显加快检索的速度,最后别忘记重要的安全性设置,限制用户访问权限,新建用户并和数据库用户做相应的映射。 不管做什么,我们都要相信自己,不能畏惧,不能怕遇到困难,什么都需要去尝试,有些你开始认为很难的事在你尝试之后你可能会发现原来她并没有你以前觉得的那样,自己也是可以的。如果没有自信,没有目标,没有信心就不可能把事情做好,当其他人都在迷茫的时候,自己一定要坚信目标,大学毕业出去即面临找工作,从学习这个专业,到以后从事这方面的工作都需要不断地去学习去实践,这次实践可以给我们敲一个警钟,我们面临毕业,面临择业,需要这些实践经验,在困难面前要勇于尝试,这是这次课程设计给我的最大感想! 以上
23、基本是这次实习的体会了,设计进行的非常艰难,编码非常不容易,才发现做一个项目最重要的不在于如何实现,而是实现之前的需求分析和模块设计。创新很难,有些流行的系统其实现并不难,难的在于对市场的分析和准确定位。设计,是一个任重道远的过程。但在做课程设计的过程中也遇到很多问题,一开始时其中最大的问题是不知道用哪种编译工具,后来选择了Microsoft Visual Studio,在编写程序时,编写程序起来也有点困难,但是也越来越顺利了。经过调试后终于把自已想到实现的功能一步步实现了,通过这次课程设计使我收获了好多,熟悉了C#的运用,还复习了数据库相关语句的编写。此次课程设计让我感受颇多:做一个数据库其
24、实是一件很有趣的事情。想到自己可以创建一个小型的数据库系统,有点学习后的满足感。数据库的建立并非难事,难点在于数据库的连接和编程语言的选择。C#的功能很强大,这也是我以后需要学习的课程,于是我毅然选择了它。再就是建立数据库系统的步骤,我的经验就是要先总体规划,再局部整理。先做好总的界面,再通过该界面的布置一步一步实现其功能!同时我体会到:熟练的编程能力,对知识运用的强烈渴望及其创新和团队的合作精神设做好一个大型数据库的基础。因此通过此次课程设计我明显感觉到自身的不足,并希望以后能更加用心地运用所学知识和学习新的知识。参考文献1 C#程序设计教程 电力出版社 20092 .施平安 清华大学出版社
25、, 20053 杨文龙,软件工程,电子工业出版社,19974 数据库系统概论 高等教育出版社 2006附 录C#语言代码如下:1.登陆namespace _2010_HotelManage public partial class login : Form MainForm mf = new MainForm(); authcode authcode = new authcode(); conndata con = new conndata(); public login() InitializeComponent(); private void login_Load(object sende
26、r, EventArgs e) authcode.CodeImage(pictureBox1); private void btn_exit_Click(object sender, EventArgs e) this.Close(); private void btn_enter_Click(object sender, EventArgs e) string check = con.check(this.textBox1.Text.Trim(), this.textBox2.Text.Trim(); if (this.textBox1.Text.Trim() = | this.textBo
27、x2.Text.Trim() = | this.textBox3.Text.Trim() = ) authcode.message_box(登?陆?信?息不?完整? !?); authcode.CodeImage(pictureBox1); else if (check = user) authcode.message_box(用?户名?有D误!? ); textBox1.Text = ; textBox1.Focus(); else if (check = password) authcode.message_box(密码?有D误 !? ); else if (textBox3.Text.T
28、rim().ToLower() != authcode.ww.ToLower() authcode.message_box(验证码?有D误!? ); authcode.CodeImage(pictureBox1); else if (check = past) authcode.message_box(成功|登?陆?!? ); authcode.CodeImage(pictureBox1); mf.power = con.u_sort.Trim(); mf.Show(); this.Hide(); else if (check = error) authcode.message_box(服t务
29、?器连?接时出?错!?); else authcode.message_box(未知a错误!? ); 2.客户入住:namespace _2010_HotelManage public partial class client_live : Form authcode m = new authcode(); live_pay live = new live_pay(); public string room_id; public client_live() InitializeComponent(); private void btm_exit_Click(object sender, Eve
30、ntArgs e) this.Close(); private void client_live_Load(object sender, EventArgs e) if (room_id != null ) roomid.Text = room_id.Trim(); this.bookdate.Text = DateTime.Now.ToString(); private void btn_clear_Click(object sender, EventArgs e) clear_all(); private void btn_ok_Click(object sender, EventArgs
31、 e) if (this.roomid.Text = | this.userid.Text = | this.username.Text = | this.sex.Text = | this.NativePlace.Text = | this.bookdate.Text = ) m.message_box(信?息不?完整?!?); return; string live_message = live.live( userid.Text.Trim(), roomid.Text.Trim(), bookdate.Text.Trim(), remark.Text.Trim(), username.T
32、ext.Trim(), sex.Text.Trim(), NativePlace.Text.Trim() ); if (live_message = error) m.message_box(房?间?不?存?在!? ); this.roomid.Text = ; else if (live_message = ok) m.message_box(顾?客已?入?住?!? ); clear_all(); else m.message_box(系统3故障?!? ); public void clear_all() this.roomid.Text = ; this.userid.Text = ; t
33、his.username.Text = ; this.sex.Text = ; this.NativePlace.Text = ; this.bookdate.Text = ; this.remark.Text = ; 3.客户结算namespace _2010_HotelManage public partial class client_pay : Form public string pay_userid; public string pay_username; public string pay_roomnum; public string pay_date; live_pay liv
34、epay = new live_pay(); authcode m = new authcode(); public client_pay() InitializeComponent(); private void btn_exit_Click(object sender, EventArgs e) this.Close(); private void client_pay_Load(object sender, EventArgs e) if (roomnum.Text.Trim() = & username.Text.Trim() = & userid.Text.Trim() = ) th
35、is.roomnum.Text = pay_roomnum; this.userid.Text = pay_userid; this.username.Text = pay_username; private void btn_clear_Click(object sender, EventArgs e) this.roomnum.Text = ; this.userid.Text = ; this.username.Text = ; private void btn_find_Click(object sender, EventArgs e) if (roomnum.Text!= & use
36、rid.Text != ) string str = livepay.find(roomnum.Text.Trim(), userid.Text.Trim(); if (str = no) m.message_box(用?户不?存?在!? ); else username.Text = str; else m.message_box(请?输?入?房?间?号?和身份Y证号?!? ); private void sum_Click(object sender, EventArgs e) if (userid.Text != & username.Text != & roomnum.Text !=
37、) mny.Text = livepay.sum(roomnum.Text.Trim(), userid.Text.Trim(); factmny.Text = mny.Text; else m.message_box(请?确认?用?户是?否?存?在!? ); private void btn_pay_Click(object sender, EventArgs e) if (userid.Text != & username.Text != & factmny.Text != ) string over = livepay.pay(userid.Text.Trim(), roomnum.Text.Trim(), factmny.Text.Trim(); if (over.Trim() = ok) m.message_box(结账?已?成功| !? ); this.roomnum.Text = ;