1软件工程课程设计06级应用(2)班03曾静1.可行性研究1.1项目总论本需求规格说明书旨在向开发人员说明将要开发的系统的详细情况,帮助开发人员明确任务。1.1.1项目名称a.待开发的系统的名称:图书借阅管理系统b.本项目的用户:图书馆管理员1.2项目背景1.2.1目标开发适合实际应用的图书借阅管理系统1.2.2用户的特点本次开发的图书借阅管理系统面向各图书馆的广大管理人员,最终用户不需要懂得专业的计算机知识,只需要通过鼠标点击相应按钮或按照提示从键盘输入少量文字即可完成操作。1.2.3假定和约束本系统开发假定用户已拥有专门的财务结算软件,本系统不处理任何财务有关的事务。1.3项目承办单位:1.4项目主管部门:06级应用2班1.5项目拟建地方部门:学校图书馆1.6研究工作的依据;22需求分析·一张详细的馆藏图书清单,包括书名、馆藏编号、ISDN号等。·可以对图书信息进行管理。·一张详细的读者清单,包括读者姓名、借书证号、联系方式等。·商品库存量高于或低于规定数量时,提出警告供进货参考。·可以对读者信息进行管理。·一张详细的借阅信息清单,包括借阅日期、借阅书目、借阅人等。·一定程度上的数据灾难防范手段。·以上操作必须是合法的操作员才能进行操作。·操作尽量简单。2.1需求规定2.1.1按照需求分析的要求,拟定本次所设计图书借阅管理系统应实现的功能如下:1.图书信息管理功能;(1)图书记录新增(2)图书记录修改(3)图书记录删除2.读者信息管理功能;(1)读者记录新增(2)读者记录修改(3)读者记录删除3.图书借阅事务处理功能;(1)借书(2)还书34.系统信息管理功能;(1)管理员帐号维护(2)数据备份(3)数据恢复(4)系统日志(5)参数配置5.操作指引功能(1)帮助文件6.查询统计功能(1)读者信息查询;(2)图书信息查询;(3)借阅记录查询;(4)系统信息统计;3.2故障处理要求·提供数据备份和恢复的支持;3.3其他专门要求·用户界面简洁,操作界面中为用户可进行的各项操作提供一定的提示,并附带帮助文件作为参考。·尽量减少要求用户从键盘输入数据的次数,各项数据的用户输入以下拉框点选为主。·提供进入系统前的合法用户验证功能。3.运行环境规定·支持windows2000,windowsxp平台。·安装SQLSERVER2000数据库管理系统。4从需求分析出发,确定了系统应具备的功能如下:·登录系统:注销用户、系统退出。·管理:管理员帐户管理、图书信息管理、读者信息管理、借阅管理。·查询:图书查询、读者查询、借阅查询。·帮助:使用说明、关于。局部ER图(1)设计局部ER模式实体和属性的定义:图书(图书编号,图书名称,作者,出版社,ISDSN,类型,定价,馆藏数量,译者,登记时间,可借数量,封面图,简介,)读者(借书证号,姓名,住址,电话,工作单位,照片,职业)(2)借书(借书时间,书号,备注)ER模型的“联系”用于刻画实体之间的关联。一种完整的方式是对局部结构中任意两个实体类型,依据需求分析的结果,考察局部结构中任意两个实体类型之间是否存在联系。若有联系,进一步确定是1:N,M:N,还是1:1等。还要考察一个实体类型内部是否存在联系,两个实体类型之间是否存在联系,多个实体类型之间是否存在联系,等等。联系定义如图4-5所示。解释如下:u一个借阅者(用户)只能具有一种身份,而一种身份可被多个借阅者所具有;u一本图书只能属于一种图书类别(类别),而一种图书类别可以包含多本图书;u一个用户可以借阅多本不同的书,而一本书也可以被多个不同的用户所5借阅。结构框图6界面设计进行本图书馆管理系统界面设计时,以整洁美观、方便友好作为宗旨,力求简化人机交互复杂程度,减少需要用户键入的数据量,对于各种非法操作给出清晰易懂的错误提示以及修正错误的建议。考虑到要方便目标用户使用本系统,在界面设计时尽可能地减少要求用户记忆的操作步骤,并为输入框、按钮等交互项添加了工具条提示,使用户能够第一时间获得关于操作的参考建议。此外,提供了用户以图文并茂的附加帮助文档,对于一些稍复杂的操作步骤,用户可以从帮助文档中获得解决方案。界面的用色,采用了与系统界面相统一的灰色作为工具条及按钮的底色,减少用户对本系统的突兀感和抵触情绪。此外,窗口底色选用柔和且吸光的浅黄色,有缓和长期使用系统时的视觉疲劳作用。主窗口上添加响应主要功能模块交互窗口的图形化工具栏,使用户能够快速直观地被指引到某一特定的功能处理上来,专心于解决问题。考虑交互元件放置的位置时,优先从符合视觉流程和用户使用心理两点进行考量,以此为指导来安排交互元件在界面上由上至下,从左到右的出现次序,并尽可能拉近元件之间的距离,减少用户需要拖曳鼠标的距离。馆管理系统中的数据库操作类DBHandle源代码#includestdafx.h#includelibrary.h#includeDBHandle.h7#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#definenewDEBUG_NEW#endif//DBHandle.cpp:implementationoftheDBHandleclass.////Construction/Destruction//DBHandle::DBHandle(){}DBHandle::~DBHandle(){}boolDBHandle::DBEOF(){//判断指针是否越过记录集最后一条记录,越过时返回TRUEif(m_pRst-adoEOF)returnTRUE;returnFALSE;}boolDBHandle::DBBOF(){//判断指针是否越过记录集第一条记录,越过时返回TRUEif(m_pRst-BOF)returnTRUE;returnFALSE;}voidDBHandle::RstConn(){//用Connection指针方式打开记录集(记录集为空时用)try{m_pRst=m_pConn-Execute((_bstr_t)strSQL,NULL,adCmdText);}catch(_com_errore){CStringtemp;temp=执行SQL查询失败!;temp+=e.Description();AfxMessageBox(temp);}}voidDBHandle::DBConn(CStringDBName){//连接指定数据库::CoInitialize(NULL);m_pConn.CreateInstance(ADODB.Connection);CStringConnStr;ConnStr.Format(Provider=SQLOLEDB.1;Integrated8Security=SSPI;PersistSecurityInfo=False;InitialCatalog=%s;DataSource=(local);,DBName);try{//连接数据库服务器方式串。连接方式:本地服务器,操作系统管理员认证,连接library数据库_bstr_tstrConnect=ConnStr.AllocSysString();m_pConn-Open(strConnect,,,0);//连接本地数据库服务器上的library,用户名密码为空,连接模式unknown}catch(_com_errore){CStringtemp;temp.Format(数据库连接失败!原因是:%s,e.Description());AfxMessageBox(temp);//2brevise}}intDBHandle::RecordCount(){//统计记录条数intcounter=0;try{m_pRst-MoveFirst();}catch(_com_errore){return0;//记录集空时统计数计0}if(m_pRst-adoEOF)return0;//记录集指针一开始就到达末尾时统计数按0计while(!m_pRst-adoEOF){m_pRst-MoveNext();counter++;}m_pRst-MoveFirst();//记录集指针归位returncounter;}longDBHandle::AutoNumber(CStringFieldName){//为新记录自动分配记录号,新记录号为当前最大的记录号加1try{m_pRst-MoveLast();longi=m_pRst-GetCollect((_bstr_t)FieldName).lVal;9returni+1;}catch(_com_errore){if(m_pRst-BOF)return1;CStringtemp;temp.Format(操作被拒绝,原因是:%s,e.Description());AfxMessageBox(temp);}return0;}voidDBHandle::SQLExcute(CStringstrSQL){//执行指定SQL查询(默认Recordset方式打开记录集,记录集为空时再尝试以Connection指针来打开)m_pRst.CreateInstance(__uuidof(Recordset));_variant_tvarSQL(strSQL);try{m_pRst-Open(varSQL,m_pConn.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);//打开方式:执行SQL语句查询,指针允许任意移动,屏蔽其他用户进行的操作//作update动作时为记录集上锁}catch(_com_errore){m_pRst=m_pConn-Execute((_bstr_t)strSQL,NULL,adCmdText);//记录集为空时的SQL查询方法}//AfxMessageBox(SQL查询成功!);}boolDBHandle::First(){//判断当前记录是否为第一条记录m_pRst-MovePrevious();//指针试探性前移一步if(m_pRst-BOF){//越界,表明原记录是第一条记录m_pRst-MoveFirst();returnTRUE;}else10{//指针归位m_pRst-MoveNext();returnFALSE;}}boolDBHandle::Last(){//判断当前记录是否为最后一条记录m_pRst-MoveNext();//指针试探性后移一步if(m_pRst-adoEOF){//越界,表明原记录是最后一条记录m_pRst-MoveLast();returnTRUE;}else{//指针归位m_pRst-MovePrevious();returnFALSE;}}voidDBHandle::RstDisConn(){//m_pRst.Release();m_pRst=NULL;}voidDBHandle::DBDisConn(){//断开数据库连接m_pRst.Release();m_pConn-Close();m_pConn=NULL;m_pRst=NULL;::CoUninitialize();}voidDBHandle::GoFirst(){//指针移到第一条记录try{m_pRst-MoveFirst();}catch(_com_errore){CStringtemp;temp.Format(操作被拒绝,原因是:%s,e.Description());AfxMessageBox(temp);}}11voidDBHandle::GoLast(){//指针移到最后一条记录try{m_pRst-MoveLast();}catch(_com_errore){CStringtemp;temp.Format(操作被拒绝,原因是:%s,e.Description());AfxMessageBox(temp);}}voidDBHandle::GoP