一、课程设计的目的与要求
- 本实验是为计算机各专业的学生在学习数据库原理后,为培养更好的解决问题和实际动手能力而设置的实践环节。通过这个环节,使学生具备应用数据库原理对数据库系统进行设计的能力。为后继课程和毕业设计打下良好基础。
- 通过该实验,培养学生在建立数据库系统过程中使用关系数据理论的能力。
- 通过对一个数据库系统的设计,培养学生对数据库需求分析、数据库方案设计、系统编码、界面设计和软件调试等各方面的能力。是一门考查学生数据库原理、面向对象设计方法、软件工程和信息系统分析与设计等课程的综合实验。
二、设计正文
实验成绩为优,所有代码均放在资料区,有源码和数据库的表图
1. 实体
一共有四个,分别是顾客、房型、房间、预定房间,下面用E-R图来表示它们所具有的属性以及四个实体之间的联系
- 逻辑模式
由此生成了:
顾客表(用户编号、姓名、密码、性别、手机号、地址)
房型表(房间类型ID、房间类型名,房间类型编号)
房间表(房间ID、房间名称、房间类型、房间位置、房间单价,备注,状态)
预定表(预定记录编号、预定时间、房间ID、入住时间,退房时间、所需总花费)
2.1 实体完整性:顾客表主码为用户ID,房型表主码为房间类型ID,房间表主码为房间ID,预定表主码为预定记录编号。
2.2 参照完整性:在预定表中房间ID是参照房间表中房间ID的外键,房间表中房间类型是参照房型表中房间类型ID的外键。如若要执行父表中被参照属性值的更新或者删除会先检查子表中参照属性中是否存在相同的属性值,如果存在则先更新/删除子表中的记录,随后更新/删除父表中的记录,从而实现级联删除和级联更新。
2.3 用户自定义完整性:用户的手机号必须是11位的数字、性别必须是男女其中一个
2.4 范式等级:所有表中均只有一个候选码,所以每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。故所有表均满足3NF。
- 程序设计
3.1使用语言以及工具
本项目为.NET项目使用C#、ASP.net结合sql server2014完成酒店管理系统项目的设计与功能实现
3.2 界面设计
登录界面
在此界面可以实现登录功能。用户可选择管理员身份与顾客用户,以及注册新用户界面,只允许顾客注册,管理员身份由系统直接分配。
注册界面
若有一项未填写的提示
两次密码不一致
管理员界面(母版中有客房,房型,用户,退出导航功能)
客房管理界面
在此界面可以跳转到不同的管理界面,以及客房的查询,删除,添加,退出以及统计最受欢迎的三个房型。
房型管理界面
在此界面可以跳转到不同的管理界面,以及房型的选择,编辑,删除,添加,和退出。
用户管理界面
对房型和标签的编辑,删除和添加。
顾客界面(用户只有权限点击退出导航,其他三个点击无反应)
顾客可以在此界面完成房间的预定,可直接选择需要的房间,选择入住时间和退房时间,系统会自动计算所需总花费,最后显示结算的表单
3.3 相关功能的实现代码如下,由于增删改查代码类似,以下就给出部分的
3.3.1增加
protected void AddBtn_Click(object sender, EventArgs e)
{
try //处理异常标准方式
{
string RName = RNameTb.Value;
string RCat = CatCb.SelectedValue.ToString();
string RLoc = LocationTb.Value;
string Cost = CostTb.Value;
string Rem = RemarksTb.Value;
string Status = "空闲";
string Query = "insert into RoomTb1 values('{0}','{1}','{2}','{3}','{4}','{5}')";
Query = string.Format(Query, RName,RCat,RLoc,Cost, Rem, Status);
Con.setData(Query);
ShowRooms();
ErrMsg.InnerText = "客房已添加!!!";
RNameTb.Value = " ";//添加完清空页面
CatCb.SelectedIndex = -1;
LocationTb.Value = " ";
CostTb.Value = " ";
RemarksTb.Value = " ";
}
catch (Exception Ex)
{
ErrMsg.InnerText = Ex.Message;
}
}
3.3.2删除
protected void DeleteBtn_Click(object sender, EventArgs e)
{
try //处理异常标准方式
{
string Query = "delete RoomTb1 where RId='{0}'";
Query = string.Format(Query, RoomsGV.SelectedRow.Cells[1].Text);
Con.setData(Query);
ShowRooms();
ErrMsg.InnerText = "房型已删除!!!";
RNameTb.Value = " ";
CatCb.SelectedIndex = -1;
LocationTb.Value = " ";
CostTb.Value = " ";
RemarksTb.Value = " ";
}
catch (Exception Ex)
{
ErrMsg.InnerText = Ex.Message;
}
}
3.3.3编辑
protected void EditBtn_Click(object sender, EventArgs e)
{
try //处理异常标准方式
{
string RName = RNameTb.Value;
string RCat = CatCb.SelectedValue.ToString();
string RLoc = LocationTb.Value;
string Cost = CostTb.Value;
string Rem = RemarksTb.Value;
string Status = StatusCb.SelectedValue.ToString();
string Query = "update RoomTb1 set RName ='{0}' ,RCategory='{1}',RLocation='{2}',RCost='{3}',RRemarks='{4}',Status='{5}' where RId={6}";
Query = string.Format(Query, RName, RCat, RLoc, Cost, Rem, Status, RoomsGV.SelectedRow.Cells[1].Text);
Con.setData(Query);
ShowRooms();
ErrMsg.InnerText = "客房信息已更新!!!";
RNameTb.Value = " ";//添加完清空页面
CatCb.SelectedIndex = -1;
LocationTb.Value = " ";
CostTb.Value = " ";
RemarksTb.Value = " ";
}
catch (Exception Ex)
{
ErrMsg.InnerText = Ex.Message;
}
}
3.3.4统计最受欢迎的三个房型
protected void Count_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=\"C:\\Users\\梁斌杰\\Documents\\Hotel Management Db.mdf\";Integrated Security=True;Connect Timeout=30"; // 请替换为您的实际连接字符串
// SQL 查询,查找 BRoom 列出现次数最多的前三位
string query = "SELECT TOP 3 BRoom, COUNT(*) AS RoomCount " +
"FROM BookingTb1 " +
"GROUP BY BRoom " +
"ORDER BY RoomCount DESC";
// 创建 SqlConnection 对象
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
// 创建 SqlCommand 对象
SqlCommand command = new SqlCommand(query, connection);
// 执行查询并获取 SqlDataReader 对象
SqlDataReader reader = command.ExecuteReader();
// 构建结果字符串
string result = "房间号\t预订次数\n"; // 使用 \n 而不是 \\n
// 遍历查询结果
while (reader.Read())
{
string room = reader["BRoom"].ToString();
int count = (int)reader["RoomCount"];
result += $"{room}\t{count}\n"; // 使用 \n 而不是 \\n
}
// 关闭数据读取器
reader.Close();
// 在页面上显示结果字符串
ScriptManager.RegisterStartupScript(this, GetType(), "Popup", $"alert('{result.Replace("\n", "\\n")}');", true);
}
catch (Exception ex)
{
// 处理可能的异常
ScriptManager.RegisterStartupScript(this, GetType(), "Popup", $"alert('发生错误: {ex.Message}');", true);
}
finally
{
// 确保连接被关闭
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
}
}
}
3.3.5客房信息显示
private void ShowRooms()//将表显示在网页上
{
string St = "空闲";
string Query = "select RId as Id,RName as Name,RCategory as Cost,RCost as Cost,Status as Status from RoomTb1 ";
RoomsGV.DataSource = Con.GetData(Query);
RoomsGV.DataBind();//执行
RoomsGV.HeaderRow.Cells[1].Text = "序号";
RoomsGV.HeaderRow.Cells[2].Text = "客房名称";
RoomsGV.HeaderRow.Cells[3].Text = "房型";
//RoomsGV.HeaderRow.Cells[4].Text = "位置";
RoomsGV.HeaderRow.Cells[4].Text = "价格";
//RoomsGV.HeaderRow.Cells[6].Text = "标签";
RoomsGV.HeaderRow.Cells[5].Text = "状态";
}
private void ShowBooking()//将表显示在网页上
{
string userId = Session["UId"].ToString();
string Query = "select * from BookingTb1 where Agent="+userId;
BookingGV.DataSource = Con.GetData(Query);
BookingGV.DataBind();//执行
BookingGV.HeaderRow.Cells[1].Text = "订单号";
BookingGV.HeaderRow.Cells[2].Text = "当前日期";
BookingGV.HeaderRow.Cells[3].Text = "客房序号";
//RoomsGV.HeaderRow.Cells[4].Text = "位置";
BookingGV.HeaderRow.Cells[4].Text = "用户ID";
BookingGV.HeaderRow.Cells[5].Text = "入住时间";
BookingGV.HeaderRow.Cells[6].Text = "退房时间";
BookingGV.HeaderRow.Cells[7].Text = "总价";
}
int Key = 0;
int Days = 1;
protected void RoomsGV_SelectedIndexChanged(object sender, EventArgs e)
{
Key = Convert.ToInt32(RoomsGV.SelectedRow.Cells[1].Text);
RoomTb.Value = RoomsGV.SelectedRow.Cells[2].Text;
int Cost = Days * Convert.ToInt32(RoomsGV.SelectedRow.Cells[4].Text);
AmountTb.Value = Cost.ToString();//选择一行放入显示框中
}
3.3.6 预定表格显示及总花费的计算
private void UpdateRoom()
{
try
{
string st = "已预定";
string Query = "update RoomTb1 set Status ='{0}' where RId={1}";
Query = string.Format(Query, st, RoomsGV.SelectedRow.Cells[1].Text);
Con.setData(Query);
ShowRooms();
ErrMsg.InnerText = "客房信息已更新!!!";
}
catch (Exception Ex)
{
ErrMsg.InnerText = Ex.Message;
}
}
int TCost;
private void GetCost()
{
DateTime DIn = Convert.ToDateTime(DateInTb.Value);
DateTime DOut = Convert.ToDateTime(DateOutTb.Value);
TimeSpan value = DOut.Subtract(DIn);
int Days = Convert.ToInt32(value.TotalDays);
TCost = Days * Convert.ToInt32(RoomsGV.SelectedRow.Cells[4].Text);
}
- 课程设计总结
1.需求分析至关重要:在设计数据库系统之前,充分理解和分析需求是关键。这包括明确数据的结构、访问模式、数据量预估等。只有深入了解需求,才能设计出合适的数据库结构和应用架构。
2.合理选择数据库类型:根据应用需求和数据特性,选择合适的数据库类型,如关系型数据库(如MySQL、PostgreSQL)、NoSQL数据库(如MongoDB、Redis)或者新型的数据存储技术(如图数据库、时序数据库)。不同类型的数据库有各自的优势和适用场景。
3.良好的数据模型设计:设计良好的数据模型是数据库设计的核心。通过实体-关系(ER)建模或其他合适的方法,确保数据结构能够有效地支持应用的功能需求,并具备良好的扩展性和性能。
4.规范化与反规范化的平衡:在数据库设计中,需要平衡规范化和反规范化的需求。规范化有助于减少数据冗余和保证数据一致性,而反规范化则可以提升查询性能。根据具体情况,选择合适的范式设计数据模型。
4.性能优化与索引设计:数据库性能对应用的响应速度至关重要。通过合理的索引设计、查询优化、数据分区等手段,优化数据库的读写性能。避免频繁的全表扫描和复杂的联合查询,有助于提升系统的整体性能。
总的来说,数据库系统设计需要综合考虑应用需求、数据特性、性能优化和安全性等因素,是一个持续演进和优化的过程。我通过查阅CSDN上的资料和B站视频的学习,不断积累经验和学习实践,设计出满足基本要求的酒店管理系统。系统中还存在许多的不足,诱待提高和完善。