软件工程图书管理系统.docx
- 文档编号:10666399
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:31
- 大小:682.23KB
软件工程图书管理系统.docx
《软件工程图书管理系统.docx》由会员分享,可在线阅读,更多相关《软件工程图书管理系统.docx(31页珍藏版)》请在冰豆网上搜索。
软件工程图书管理系统
软件工程课程设计报告
图书管理系统
姓名:
甘文道
专业:
计算机应用技术
单位:
学院十三队
学号:
2013130601
指导教师:
沙为超
2014年1月18日
1
目录
2
需求定义描述
图书管理系统中存在2种角色:
图书管理人员和普通的读者。
假设图书馆的工作人员要处理下列日常工作:
●借书:
核实读者身份并检查是否存在下述情况:
⏹该读者借书的数额超标;
⏹该读者所借的书过期未还;
⏹该读者曾因借书过期被罚款而未交;
如不存在上述情况,则登记借书信息;
●还书:
检查所还图书是否损坏或过期,是则登记罚单信息并打印罚单,在交纳罚金前,不允许该读者继续借书。
若图书损坏,注销该图书信息,否则进行还书登记。
●罚款:
根据罚单收取罚金,同时取消该读者的借书限制。
●图书信息维护:
新书上架、旧书下架及图书信息查询。
●读者信息维护:
录入、注销、修改及查询读者信息。
此外,图书馆还应向读者提供下列基本功能:
●查询图书信息;
●查询自己的基本信息和借书记录;
●续借;
该系统预定的运行环境如下:
1.操作系统:
WindowsXP操作系统;
2.数据库系统:
MicrosoftSQLServer2000企业版;
3需求分析与设计
3.1初步需求分析
在图书馆管理系统中有两类用户,分别是图书管理员与普通读者(学生)。
每个用户都拥有自己的账号(ID)和密码,通过这两者来登录管理系统;管理系统则根据账户的类型给予用户相应的操作权限。
管理员管理对系统中书籍、读者的信息资料进行相关维护,对图书和读者的信息可以进行增删改查的操作。
管理员还负责学生借阅、归还图书的登记,并可收取读者因借阅超时或损坏图书造成的罚金。
普通读者可以通过自己的账号登陆系统。
登陆后,读者可以查看系统中所有图书的基本信息以及目前所处状态(在架/被借阅);同时,也可以查看本人在系统中的个人信息、欠费情况等,并可以对其中一些信息进行修改(如联系方式、登陆密码等);此外,读者可以查看自己目前的借书清单,并可以对相应图书提出续借请求。
普通读者要进行借书、还书、缴纳罚款等操作时,需要到管理员处进行登记。
由管理员通过学生ID和图书ID进行借书、还书的登记。
图书馆中每部书都对应一个唯一的编号,即图书ID,以便区分相同的图书。
每名读者最多可借图书数目由读者身份等信息决定。
一次借阅图书时间为30天,并可以续借一次,续借时间10天,但必须在到期前提出申请。
罚金根据该读者所有图书的过期时间和图书损坏与否进行计算,如没有及时上交罚金,则不能进行图书的借阅和续借。
3.2系统数据流图
由初步需求分析可得系统的数据流图如下:
图书管理系统的基本系统模型
普通读者事务处理数据流图
管理员事务处理数据流图
3.3核心数据的数据字典
根据分析,系统中主要要处理的核心数据包括有:
学生ID、管理员ID、图书ID、欠款、图书价格、借阅剩余天数、可续借次数等几项,现在将核心数据和部分有代表性的数据列出:
名字
别名
描述
格式
位置
学生ID
uid
普通读者的学号
10个字符
读者信息表
姓名
sname
读者的名字
10个字符
读者信息表
欠款
fine
读者的应缴罚金总数
数
读者信息表
图书ID
bid
书籍的编号
10个字符
图书信息表
书名
bname
书籍的名称
50个字符
图书信息表
价格
cost
书籍的标价
数
图书信息表
借阅剩余天数
b_day
该书距归还期限的时间
数
借阅信息表
可续借次数
renew
该书还可续借的次数
数
借阅信息表
管理员ID
uid
图书管理员的编号
10个字符
管理员表
3.4系统E-R图及数据库逻辑设计
根据需求分析,得到如下的E-R图:
对于借阅关系,对整个系统来讲,一本书可以被多人借阅,一个人可以借阅多本书,为多对多关系;但考虑实际情况,在系统运行的任一时刻,某本书最多只可能属于一个人,因此,若是系统在图书归还后不再记录以往的借阅记录,也可将该关系看做一个一对多关系。
不过当做一对多关系处理不便于后期实现功能的扩展(如打印某月份的借书清单等),因此本管理系统中将其作为多对多关系处理。
考虑实际情况,在系统中还存在以下两个管理关系:
因本系统需求中并没有为每个管理员分派不同的管理范围(如某人负责管理本科生信息、某人负责管理社会科学图书等等),即每个管理员都有全部的管理权限,因此没有在系统中设置相应的表对应这两个管理关系。
根据得到的E-R图可转换出以下几个关系模式:
1.管理员(管理员ID,密码)
此为管理员实体所对应的关系模式。
2.普通读者(学生ID,密码,姓名,类别,院系,联系电话,Email,欠款)
此为普通读者(学生)实体所对应的关系模式。
3.图书(图书ID,书名,类别,作者,出版社,价格,简介)
此为图书实体所对应的关系模式。
4.借阅(学生ID,图书ID,借阅剩余天数,可续借次数)
此为联系“借阅”所对应的关系模式。
4详细设计
4.1系统的命名规格定义
本系统设计时,参照MicrosoftVisualC++6.0中的命名习惯,对函数和变量的命名做出如下规定:
函数名称和变量依函数或变量在系统中所起到功能命名,使用相应的英文单词或缩写。
对于系统中的自定义宏,名称使用相应单词或缩写,并大写表示。
绑定了MFC中控件的变量,名称前面加“m_”表示。
例如:
m_sname表示绑定了MFC界面中输入/输出学生姓名文本框的变量。
4.2数据结构及数据库建立
由关系模式可建立下面所示的基本表:
1.管理员信息,adm表:
2.普通读者信息,stu表:
3.图书信息,book表:
4.借阅信息,borrow表:
其中包含有两个外键:
根据需求,borrow表中的b_day(即借阅剩余天数)的应该每天减1,因此使用了MicrosoftSQLServer中的“作业”功能。
设置如下图所示:
“步骤”选项卡中添加信息
“调度”选项卡中设置调度信息
4.3系统总体模块结构
整个系统大致可以分为系统框架模块、管理员模块和学生模块3大部分。
分别实现了系统的框架界面生成、图书管理员日常操作和普通读者允许的操作。
每个大模块下又下属若干小模块,具体实现了如增、删、改、查等各种具体的功能操作。
具体的结构调用如下图所示:
4.4系统主要模块算法实现
1.借书模块
voidbor:
:
OnOk()
{
UpdateData(TRUE);//更新界面信息
……
sql1="select*fromstuwhereuid='"+m_sid+"'";
连接数据库,执行sql1所写命令,将stu.type值存入temp;
根据类别计算借书最大数额,结果存入max中;
将stu.fine值存入temp;
fine=atoi(temp);
sql="selectborrow.bidid,bname,b_dayfromborrow,bookwhereborrow.sid='"+m_sid+"'andborrow.bid=book.bidorderbyb_dayDESC,idDESC";
连接数据库,执行sql所写命令
while(ado.m_pRecordset->adoEOF==0)//遍历所得记录集,在列表中显示
{
列表中显示记录;
num++;//统计借书数目
}
if(fine>0){MessageBox("未缴罚款不可借书!
","提示");return;}
if(num>=max){MessageBox("借书数额超标!
","提示");return;}
//插入新的借书记录
sqlT="insertintoborrow(sid,bid,b_day,renew)values('"+m_sid+"','"+m_bid+"',30,1)";
ado.ExecuteSQL((_bstr_t)sqlT);
更新列表;
}
2.还书模块
voidret:
:
OnOk()
{
UpdateData(TRUE);
……
sql1="select*fromstuwhereuid='"+m_sid+"'";
连接数据库,执行sql1所写命令,将stu.fine值存入fine;
sql="selectborrow.bidid,bname,b_dayfromborrow,bookwhereborrow.sid='"+m_sid+"'andborrow.bid=book.bidorderbyb_dayDESC,idDESC";
连接数据库,执行sql所写命令;
遍历所得记录集,在列表中显示;
//计算超时罚金
sqlT="selectb_dayfromborrowwheresid='"+m_sid+"'andbid='"+m_bid+"'";
读取b_day存入day中;
if(day<0)fine-=day*YUAN_PER_DAY;
//删除借书记录
sqlT="deleteborrowwherebid='"+m_bid+"'";
ado.ExecuteSQL((_bstr_t)sqlT);
if(m_damage1)//如果图书损坏
{
sqlT="selectcostfromborrow,bookwhereborrow.sid='"+m_sid+"'andborrow.bid=book.bid";
查找图书信息,读出书价存入cost;
fine+=cost;
//删除损坏图书记录
sqlT="deletebookwherebid='"+m_bid+"'";
ado.ExecuteSQL((_bstr_t)sqlT);
}
//更新罚金stu.fine
temp.Format("%d",fine);
sqlT="updatestusetfine='"+temp+"'whereuid='"+m_sid+"'";
ado.ExecuteSQL((_bstr_t)sqlT);
更新列表;
}
3.罚款模块
voidfin:
:
OnOk()
{
UpdateData(TRUE);
……
sql="select*fromstuwhereuid='"+m_sid+"'";
连接数据库,将stu.fine存入call;
从界面中读取缴费金额存入paid;
bal=call-paid;
if(bal<0)bal=0;m_balance.Format("%d",bal);//余额写回数据库
sql1="updatestusetfine='"+m_balance+"'whereuid='"+m_sid+"'";
ado.ExecuteSQL((_bstr_t)sql1);
}
4.增删改查模块
系统中很多模块中都使用了增删改查的操作,虽然具体的实现有些不同,但流程是相同的。
因此只列出了几个代表。
此外,由于这几个模块均为顺序执行,代码量小,在此仅写出算法的伪代码。
voidbook_inf:
:
OnAdd()//添加书籍信息
{//这种方法与借书模块中的插入方法不同,没有用到SQL的插入语句
……
sql="select*frombook";
_RecordsetPtrm_pRecordset;
m_pRecordset=m_AdoConn.GetRecordSet(sql);
m_pRecordset->AddNew();//为记录集添加新行
m_pRecordset->GetFields()->GetItem("bid")->Value=(_bstr_t)m_id;
……
m_pRecordset->Update();//更新数据库
刷新列表框;
}
voidbook_inf:
:
OnDelete()//删除某书本的信息
{//删除某书本的信息,要先删除与该书关联的借书信息,以保证参照完整性
……
sql0="deletefromborrowwherebid='"+bid+"'";//删除该书的借书信息
sql="deletefrombookwherebid='"+bid+"'";//删除该书的所有信息
ado.ExecuteSQL((_bstr_t)sql0);
ado.ExecuteSQL((_bstr_t)sql);
OnClear();//刷新
}
voidbook_inf:
:
OnUpdate()//修改书本信息
{
……
CStringbid=m_id;//保存修改前ID
UpdateData(TRUE);//获得更改信息
……
sql="updatebooksetbid='"+m_id+"',bname='"+m_name+"',type='"+m_type+"',publish='"+m_publish+"',author='"+m_author+"',cost='"+m_cost+"',intro='"+m_intro+"'wherebid='"+bid+"'";
ado.ExecuteSQL((_bstr_t)sql);
刷新列表;
}
voidbook_inf:
:
OnSelect()//信息的查询
{
sql="select*frombookwherebidlike'%"+m_id+"%'andbnamelike'%"+m_name+"%'andtypelike'%"+m_type+"%'andpublishlike'%"+m_publish+"%'andauthorlike'%"+m_author+"%'andintrolike'%"+m_intro+"%'orderbybidDESC";
//执行多个字符串匹配的查询
连接数据库,执行sql语句;
遍历所得记录集,更新列表;
}
5.续借模块
voidstud1:
:
OnSelect2()
{
……//学生、书籍等信息以前已读入,无需在此读入
fine=atoi(m_fine);
if(fine>0){MessageBox("欠费不能续借!
","提示");return;}
sql.Format("select*fromborrowwherebid='"+m_id+"'");
执行sql语句,得到m_renew与m_day;
if(m_renew=="0"){MessageBox("不可再次续借!
","提示");return;}
day=atoi(m_day);
if(day<0){MessageBox("期限已过不能续借!
","提示");return;}
day+=RENEW_TIME;//改写剩余时间
m_day.Format("%d",day);//更新借书记录b_day与renew
sql="updateborrowsetb_day='"+m_day+"',renew=0wherebid='"+m_id+"'";
ado.ExecuteSQL((_bstr_t)sql);
MessageBox("续借成功","提示");
刷新;
}
6.系统框架模块
系统界面建立在一个对话窗口中。
窗口中加入一个Tab控件,该控件可加载设计好的管理员或者普通用户的操作界面。
系统的具体功能实现都在加载进的界面中完成,该框架仅提供了切换不同模块的功能。
在进入系统前,会出现一个登陆界面。
登陆界面获得用户类别后系统会根据获得的类别选择加载的选项卡。
这样,普通读者和管理员就会看到不同的系统界面,使用不同的功能。
实现以上功能主要编写了两个函数:
OnInitDialog()和OnSelchangeTab1(NMHDR*pNMHDR,LRESULT*pResult)。
其大致内容如下:
BOOLCBookDlg:
:
OnInitDialog()//系统界面的初始化函数
{
……//以上为系统生成代码
log_on.DoModal();//弹出登录窗口
if(user.state==1){//管理员登陆
m_tab.InsertItem(0,"借阅管理");//设置标签,加载管理员界面
m_tab.InsertItem(1,"图书信息");
m_tab.InsertItem(2,"学生信息");
borrow.Create(IDD_BORROW,GetDlgItem(IDC_TAB1));
book_inf.Create(IDD_BOOK,GetDlgItem(IDC_TAB1));
stud_inf.Create(IDD_STUDENT,GetDlgItem(IDC_TAB1));
……
}
elseif(user.state==0){//普通读者登陆
m_tab.InsertItem(0,"图书信息");//设置标签,加载学生界面
m_tab.InsertItem(1,"个人信息");
book1.Create(IDD_BOOK1,GetDlgItem(IDC_TAB1));
stud1.Create(IDD_STUDENT1,GetDlgItem(IDC_TAB1));
……
}
else{//未登录
m_tab.InsertItem(0,"请先登录");//加载default页面
def.Create(IDD_DEFAULT,GetDlgItem(IDC_TAB1));
……
}
returnTRUE;
}
voidCBookDlg:
:
OnSelchangeTab1(NMHDR*pNMHDR,LRESULT*pResult)
{//不同页面切换
intCurSel;
CurSel=m_tab.GetCurSel();//获得选取的页面号
if(user.state==1){//管理员界面
switch(CurSel)
{
case0:
//将第一页显示出来
borrow.ShowWindow(TRUE);
book_inf.ShowWindow(FALSE);
stud_inf.ShowWindow(FALSE);
break;
case1:
……
case2:
……
default:
;
}
}
elseif(user.state==0){//管理员界面
switch(CurSel)
{
case0:
book1.ShowWindow(TRUE);
stud1.ShowWindow(FALSE);
break;
case1:
……
default:
;
}
}
*pResult=0;
}
7.其他
voidstud_inf:
:
OnClickList3(NMHDR*pNMHDR,LRESULT*pResult)
{//点击列表框后,将当前列表框中的基本信息内容显示到各编辑框中同步显示
……
nItem=m_list1.GetNextItem(-1,LVNI_SELECTED);
POSITIONpos=m_list1.GetFirstSelectedItemPosition();
if(pos!
=NULL)
{
m_nIndex=m_list1.GetNextSelectedItem(pos);
m_uid=m_list1.GetItemText(m_nIndex,0);//获得并显示学号
UpdateData(FALSE);
}
sql.Format("select*fromstuwhereuid='"+m_uid+"'");
m_pRecordset=ado.GetRecordSet((_bstr_t)sql);//打开记录集
m_sname=(char*)(_bstr_t)m_pRecordset->GetCollect("sname");
……//更新编辑框信息
刷新;
*pResult=0;
}
5测试报告
5.1程序界面及基本操作
运行程序后出现登陆界面:
输入正确的ID与密码后就可进入系统,下面是普通读者的界面:
查询图书信息界面
更新个人信息&续借界面
管理员登陆后的界面如下:
借书界面
还书界面
罚金界面
图书信息管理界面
学生信息管理界面
查询图书、学生等详细信息时,有两种查询方式:
第一种是通过右侧列表列出的全部记录中直接点击所需记录查看;另一种是通过在左侧输入查询条件来进行搜寻,右侧列表会列出符合条件的记录。
点击相应记录即可查看全部信息。
给定条件查询
浏览查询结果
进行添加操作时,直接左侧编辑框中输入新记录的信息点击添加按钮即可。
进行删除操作时,先在列表中选择所删记录,再点击删除按钮。
进行修改操作时,先在列表中选择要修改的记录,在左侧编辑框中进行修改后点击修改按钮。
5.2测试用例
测试主要采用黑盒测试,因为不可能遍历所有的数据,故对可能输入的数据进行等价划分,从中选取了有代表性的数据组成若干条记录经行测试。
数据库中预存测试数据如下:
1.管理员信息,adm表:
2.普通读者信息,stu表:
3.图书信息,book表:
4.借阅信息,borrow表:
在系统中对这些数据进行增删改查、缴费、罚款等操作,测试系统的各个模块的功能,进而判断系统的运行状况。
5.3测试结果
经过使用上述测试数据,进行各种合法或非法操作,所的测试结果总体符合设计要求。
当进行合法操作时,系统可以按基本操作所述正常运行,输出结果正确,没有发现异常,符合设计。
对大部分非法操作或非法数据,系统能正确进行提示,部分结果如下:
修改密码时2次输入不同
续借过期图书
有欠款时续借
借书时未写学号
插入记录不完整(例为编号为空值)
登录时用户名或密码错误
但
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 图书 管理 系统
