题目:_______________________
作 者 姓 名: 学 号: 系(院)、专业: 软件工程系 指导教师姓名: 指导教师职称:
2010 年 月 日
注:请认真填写的姓名及学号信息,并要求与学院规定的一致
1. 系统需求说明
本系统的最终用户为宿舍楼管理员,本宿舍楼的学生。
(1)入校时,每位同学都有唯一的学号,并被分配到指定的宿舍楼和指定的宿舍,也会有一个宿舍号,其入校时间就是他的入住时间。另外,为了管理上的方便,同一院系的学生的宿舍一般在一起,相应地会有其所在的院系名称。
(2)每间宿舍都有唯一的宿舍号,入校时,宿舍会装公用电话机,相应地就有宿舍电话号码。和宿舍的人员
(3)宿舍楼在指定的时间关门(比如晚上11点),若有同学晚于关门时间回宿舍,需通知宿舍楼管理员,同时应登记晚归学生学号,宿舍号,时间和晚归原因,以利于学校的管理和查证。 (4)每当放寒假或暑假时,同学们大部分都会回家;每当“五·一”或“十·一”放假时,同学们也有很多不会留在宿舍。为加强学校对同学假期安全的管理,离校的同学应登记离校时间,待返校后记录返校时间,以便学校查证和管理。
基于以上的需求:
(1)宿舍楼管理员能查询上面提到的宿舍楼的所有相关信息,包括某一学号的学生在宿舍楼中住宿的详细信息和夜归的详细信息和学生离返校的信息。以利于对整个宿舍楼的全面管理。
(2)当学生基本信息发生变化时,宿舍楼管理员能对其进行修改。比如,某些同学搬到其他的宿舍中去,他们在本宿舍楼中相应的记录就应该删去;或者学生转换专业,他们记录中院系的信息也要作相应的修改等等。
(3)本宿舍楼的学生能查询其所在的宿舍的所有信息, 2. 数据库结构设计 (1)概念结构设计
使用E-R图表示对数据库中要存储的信息及语义进行详细描述; (2)逻辑结构设计 住宿学生表: 属性名 学号 姓名 性别 专业 类型 char char char char 长度 20 20 4 40 备注 住宿学生学号 住宿学生姓名 学生专业 宿舍号 入住时间 宿舍表: 属性名 宿舍号 宿舍电话 密码表: 属性名 用户明 密码 用户类型 离校表: 属性名 学号 宿舍号 离校时间 返回时间
char date 6 8 住宿学生宿舍号 新生搬入时间 类型 char char 长度 6 15 备注 类型 char char tnyint 长度 20 20 1 备注 管理员或学生 类型 char char date date 长度 20 6 8 8 备注 离校学生姓名 离校学生宿舍号 学生离校时间 学生返校时间 详细描述将E-R图转换成关系模型的过程以及对关系模式的规范化,至少达到3NF)(3)(3)物理结构设计
以表格形式详细描述系统需要的基本表及属性、视图和索引,对基本表的主键、候选键、外键及被参照表进行说明,对基本表中数据的约束条件进行说明。
3. 系统功能设计 学生部分:
1、处理用户注册 2、处理用户登录
3、用户可以查询学生信息。
4、用户可以修改用户自己密码。 管理员部分:
1、处理管理员登录
2、管理员可以查询学生信息。
3、管理员可以插入与查询学生夜归信息。 4、管理员可以查询在校与离校学生信息。 5、管理员可以修改管理员密码
4. 系统实现
(1)本软件是基于SQL Sever 2000和Visual C++6.0的软件开发环境和至少奔腾以上处理器以上
(2)◆首先按照上边所设计的逻辑结构,创建数据库,并输入部分数据,例如在密码表中输
入用户名为ys密码为1用户类型为管理员和一个用户名为wj密码为0的学生类型的数据。
◆利用系统自带的ODBC数据库管理器建立一个名为“宿舍管理”的数据源。 (3)●建立名为“宿舍管理”的工程。
●设计用户登录窗口
说明:登录串口分为两种一种是管理员登录,一种为用户登录
(1)添加对话框类为psw,并在psw类中添加CDatabase类型的变量m_database和Crecordset类型的变量m_recordset;并且添加相应的全局变量extern CString username,userpower;
(2)添加消息相应函数,并编写如下代码 UpdateData(true);
if(!m_database.IsOpen ()) {
if(m_database.Open(_T(\"宿舍管理\"))) {
m_crecordset.m_pDatabase=&m_database; CString sql,select;
if(m_select.GetCurSel()==0){select=\"管理员\";}
else{select=\"学生\";}
sql.Format(\"select * from 密码表 where 用户名='%s' and 密码='%s' and 用户类
型='%s'\
m_crecordset.Open(CRecordset::forwardOnly,sql); if(m_crecordset.GetRecordCount ()==0) {
} else { } }
} else
MessageBox(\"用户名密码错误\");
{ userpower=select; } }
m_crecordset.Close (); m_database.Close ();
CDialog::OnOK();
MessageBox(\"不能打开数据库\");
● 设计启动界面。加载MFC组建Csplash并设置启动时间为1500ms
相应的代码如下:
int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// Center the window.
CenterWindow();
// Set a timer to destroy the splash screen. SetTimer(1, 1500, NULL); return 0; }
● 在资源中加入一张位图IDB_BITMAP1
并且在Ondraw函数中加入下列代码,以实现单文档背景 void CMy2View::OnDraw(CDC* pDC) {
CMy2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
CBitmap m_Bitmap;
m_Bitmap.LoadBitmap(IDB_BITMAP3); CDC memDC;
//设备上下文
//创建内存设备上下文
//将位图选人设备上
memDC.CreateCompatibleDC(pDC); memDC.SelectObject(&m_Bitmap);
下文 域 }
● 设计用户注册对话框
运行后效果
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,x,y,SRCCOPY); //绘制位图背景 memDC.DeleteDC();
BITMAP m_Bmp;
//声明BITMAP对象
//获得位图信息 //获得位图的宽度 //获得位图的高度
m_Bitmap.GetBitmap(&m_Bmp); int x = m_Bmp.bmWidth; int y = m_Bmp.bmHeight; CRect rect;
//声明区域对象
//获得编辑框客户区
GetClientRect(rect);
// TODO: add draw code for native data here
图为输入注册相关信息后的界面 void zhuce::OnOK() {
UpdateData(1);
if(!m_database.IsOpen()) { }
if(!m_database.Open(_T(\"宿舍管理\"))) { }
MessageBox(\"不能打开数据库!\");
if(!(m_name&&m_zhuanye&&m_sno)) else {
CString strSQL,sex;
MessageBox(\"输入信息不完整,不能入库!\");
if(m_sex.GetCurSel()==0){sex=\"男\";} else{sex=\"女\";}
strSQL.Format(\"insert into 住宿学生 (学号,姓名, 性别,专业,宿舍号, 入住时间)
values('%s','%s','%s','%s','%s','%s')\
m_database.ExecuteSQL(strSQL);
MessageBox(\"注册成功!\学生注册\");
m_database.Close(); CString str;
str.Format(\"学号:%s性别:%s姓名:%s\\r\\n专业:%s宿舍号:%s入住时
间:%s\\r\\n\
m_sql+=str;
UpdateData(0); }
● 学生查询和管理员查询
工具栏中的两个“学生查询”和“管理员查询”对应于一个对话框。只是查询时查询的结果处理不同,当时学生查询时,只能查自己的,管理员课以查看全部 学生时,运行界面: //CDialog::OnOK(); }
当是管理员时,其查询界面为:
列表控件初始化代码:
BOOL stu_check::OnInitDialog() {
CDialog::OnInitDialog();
// TODO: Add extra initialization here m_list.InsertColumn(0,\"学号\"); m_list.InsertColumn(1,\"姓名\"); m_list.InsertColumn(2,\"性别\"); m_list.InsertColumn(3,\"专业\"); m_list.InsertColumn(4,\"宿舍号\"); m_list.InsertColumn(5,\"住宿时间\"); CRect r;
m_list.GetWindowRect(&r); int wid=r.Width (); for(int i=0;i<6;i++) { }
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_list.SetColumnWidth(i,wid/6);
return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
其查询相应的代码为: void stu_check::OnOK() {
// TODO: Add extra validation here
UpdateData(1);
if(!m_database.IsOpen()) {
if(!m_database.Open(_T(\"宿舍管理\"))) { }
CString strSQL,s;
m_recordset.m_pDatabase=&m_database; if(userpower!=\"管理员\") {
strSQL.Format(\"select * from 住宿学生 where 学号='%s'\MessageBox(\"Cannot open database!\信息查询\"); return;
m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
} else {
s.Format(\"select * from 住宿学生\");
m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,s);
}
if(m_recordset.GetRecordCount()==0) {
MessageBox(\"宿舍没有此人!\学生信息查询\");
m_recordset.Close(); }
m_list.DeleteAllItems();
m_database.Close(); return;
m_recordset.MoveFirst(); int i=0;
while(!m_recordset.IsEOF()) {CString temp;
m_list.InsertItem(i,temp);
m_list.SetItemText(i,0,m_recordset.m_column1 ); m_list.SetItemText(i,1,m_recordset.m_column2 ); m_list.SetItemText(i,2,m_recordset.m_column3 ); m_list.SetItemText(i,3,m_recordset.m_column4 ); m_list.SetItemText(i,4,m_recordset.m_column5 );
m_list.SetItemText(i,5,m_recordset.m_column6 ); } }
当学生毕业需要删除时: 当按下删除时界面
i++;
m_recordset.MoveNext(); UpdateData(0);
}
m_database.Close();
删除相应代码为:
UpdateData(1); if(!m_database.IsOpen()) {
if(!m_database.Open(_T(\"宿舍管理\"))) { }
CString strSQL;
m_recordset.m_pDatabase=&m_database;
MessageBox(\"Cannot open database!\信息查询\"); return;
strSQL.Format(\"select * from 住宿学生 where 学号='%s'\ m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
int i=m_list.GetNextItem(-1,LVNI_SELECTED); CString sql=(m_list.GetItemText(i,0)); if(sql==\"\") { } else {
if(MessageBox(\"您确定要删除吗?\删除询问
MessageBox(\"请选择一行\");
\ } }
其中在删除中用到刷新函数refresh().其相应的代码为:
{
CString s;
s.Format(\"delete 住宿学生 where 学号='%s'\
m_database.ExecuteSQL(s);
MessageBox(\"删除成功!\提示\");
}
UpdateData(0); }
m_database.Close();
refreshlist();
void stu_check::refreshlist() {
UpdateData(1); {
if(m_database.Open(_T(\"宿舍管理\"))) {
CString strSQL,s;
m_recordset.m_pDatabase=&m_database; if(userpower!=\"管理员\") {
strSQL.Format(\"select * from 住宿学生 where 学号='%s'\
m_list.DeleteAllItems(); if(!m_database.IsOpen())
m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
} else {
s.Format(\"select * from 住宿学生\");
m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,s);
}
m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
m_recordset.MoveFirst(); int i=0;
while(!m_recordset.IsEOF()) {CString temp;
m_list.InsertItem(i,temp);
m_list.SetItemText(i,0,m_recordset.m_column1 ); m_list.SetItemText(i,1,m_recordset.m_column2 ); m_list.SetItemText(i,2,m_recordset.m_column3 ); m_list.SetItemText(i,3,m_recordset.m_column4 ); m_list.SetItemText(i,4,m_recordset.m_column5 );
m_list.SetItemText(i,5,m_recordset.m_column6 );
i++;
m_recordset.MoveNext(); UpdateData(0);
}
} }
}
m_database.Close();
学生与管理员密码修改:
添加确认消息函数; UpdateData(1); if(!m_database.IsOpen()) { }
m_recordset.m_pDatabase=&m_database; CString strSQL;
strSQL.Format(\"select * from 密码表 where 用户名='%s' and 密码='%s' \
m_recordset.Open(CRecordset::forwardOnly,strSQL); if(m_recordset.IsBOF())//记录集为空 {
if(!m_database.Open(_T(\"宿舍管理\"))) { }
MessageBox(\"不能打开数据库!\");
} else {
MessageBox(\"用户密码不正确,请重新输入\");
if(m_newpsw!=m_newpsw2) { } else {
strSQL.Format(\"update 密码表 set 密码='%s'where 用户名MessageBox(\"两次输入密码不一致,请重新输入\");
='%s'\ }
m_recordset.Close(); m_database.Close(); }
管理员具有查询学生离校的情况:
}
MessageBox(\"密码修改成功\"); UpdateData(0);
m_database.ExecuteSQL(strSQL);
查询代码:
void stu_check1::OnOK() {
// TODO: Add extra validation here UpdateData(1); {
MessageBox(\"非管理员不能进行此项操作!\"); if(userpower!=\"管理员\")
return; } else {
if(!m_database.IsOpen()) {
if(!m_database.Open(_T(\"宿舍管理\"))) { }
CString strSQL;
m_recordset.m_pDatabase=&m_database;
MessageBox(\"Cannot open database!\信息查询\"); return;
strSQL.Format(\"select * from 离校 where 学号='%s'\ m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
if(m_recordset.GetRecordCount()==0) {
MessageBox(\"宿舍没有此人!\学生信息查询\");
m_recordset.Close(); }
m_list.DeleteAllItems(); m_recordset.MoveFirst(); int i=0;
while(!m_recordset.IsEOF()) {CString temp;
m_database.Close(); return;
} }
m_list.InsertItem(i,temp);
m_list.SetItemText(i,0,m_recordset.m_column1 ); m_list.SetItemText(i,1,m_recordset.m_column2 ); m_list.SetItemText(i,2,m_recordset.m_column3 ); m_list.SetItemText(i,3,m_recordset.m_column4 ); i++;
m_recordset.MoveNext(); UpdateData(0);
}
m_database.Close(); }
当学生回来后要删除其离校记录: 删除代码同上;
创建工程文件及窗体,添加所需的控件,为相应控件的事件编写代码,以实现目标功能。(在此包括:代码、运行后的界面) 五、实验总结
在本次实验前我本来打算做好友管理系统,后来了解到做通讯录的同学较多,就放弃了原来的想法,想到宿舍管理好像更有用和实际,所以就导致了最终的实验结果。
在本次实验前我花了大量的时间去了解VC++在ODBC中的使用方法并且看了像《visual c++ +SQL sever》《SQL sever实验指导》《Visual C++数据库卡发》《Visual c++从入门到精通》等数据库相关书籍。开始时觉得有好多都不理解,不明白。后来通过老师和同学的帮助总算大概了解了Visual c++ SQL sever 的开发步骤和开发方法。通过这次的实验我也了解到一些关于ADO编程的基本方法,虽然在实验中没有使用但我觉得Visual C++ADO开发功能更加强大,所以我决定利用寒假的有效时间再好好做做ADO的数据库编程。
本次实验中:通过反复的实验了解了(1)有关记录集的使用和数据库的基本连接
(2)基本的增删改查功能(3)在用列表控件显示数据与用列表控件删除数据时的一些错误(4)由于管理员和普通学生都拥有查询的功能,但是他们查询的范围又不一样,这就必须全局变量来予以控制,并处以不同的SQL 执行(5)在进行界面处理时的启动界面的显示 尚未解决的问题:
(1) 在使用不同变量类型的变量时函数的使用方法的模糊 (2) 美化界面的基本方法
(3) 不同权限的用户使用同一对话框时的不同处理方法
(写出收获和体会,包括已解决和尚未解决的问题,进一步完善的设想与建议。)
常用网址收藏
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务