数据库课程设计报刊订阅管理系统.doc
数据库课程设计题 目 报刊订阅管理系统 专业班级 计算机科学与技术07级11班 学 号 3104006476 姓 名 合 作 者 随着时代的发展,计算系软件和系统的成熟,报刊如果简单方面订阅成为一个影响多数人生活的问题。而建立报刊订阅系统是一个很好的解决办法。经过三年的学习,我们对计算机方面的知识有了很大的提升,本着理论联系实际的宗旨,通过学校提供的这次课程设计实践的机会,在指导教师的帮助下,历经两周时间,我自行设计一套报刊订阅系统,在下面的各章中,我将以这套报刊订阅系统为例,谈谈其开发过程和所涉及到的问题。设计目的应用对数据库系统原理的理论学习,通过上机实践的方式将理论知识与实践更好的结合起来,巩固所学知识。实践和巩固在课堂教学中学习的关于DB2的有关知识,熟练掌握对于给定结构的数据库的创建、基本操作、程序系统的建立和调试以及系统评价。实践和巩固在课堂教学中学习的关于关系数据库原理的有关知识和数据库系统的建立方法,熟练掌握对于给定实际问题,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程,为毕业设计打下基础。设计内容选择课题并且对课题的相关信息有一定的了解,对于我选的课题来说,我必须了解报刊订阅系统的构造以及订阅人的信息还有报刊的相关信息。通过这些信息制成表格,输入到数据库中,使之能够进行查询、修改、删除并且与报刊订阅系统执行相同的操作。需求分析阶段就是要研究我所作的报刊订阅系统的具体分类和实施过程流图。概念设计阶段要完成数据抽象与局部视图设计还有视图的集成。逻辑结构设计阶段要把E-R图转化为关系模式并且把我输入的六张表结合在一起完成一个总关系表。最后就是要运行和实施数据库。要把查询结果与过程抓几张图。 第二章 需求分析需求分析的任务调查报刊订阅系统应用领域涉及的内容,对涉及到领域的各个应用的信息要求和操作要求进行详细分析,形成需求分析说明书。最重要的是调查、收集信息、分析订阅人信息和报刊订阅流程。处理要求、数据的安全性与完整性要求。要求系统能有效、快速、安全、可靠和无误的完成上述操作。并要求客户机的界面要简单明了,易于操作,服务器程序利于维护。需求分析的过程现在随着网络、计算机以及数据库的快速发展,报刊的订阅也不再是传统低效的纸笔记录了,已经转向网络。本系统就是面向一个企业的报刊订阅管理系统。此系统是一种比较智能化的管理系统,它面向所有企业部门的职工用户,但具有比较高的安全性能。它能够实现报刊订阅的基本功能,包括新报刊信息的录入、订阅、查询等操作以及后台数据库的备份和恢复。用户合法注册后必须输入有效密码才能成功进入此系统,可以进行订阅报刊,查询信息,统计信息等操作。对于非法操作,系统有识别和防护措施本系统主要有以下功能模块:l (1)登陆功能:登陆系统为身份验证登录。分为管理员登录和一般用户登录。分别通过不同的用户名和密码进入报刊订阅管理界面。l (2)录入新信息功能:对于管理员,包括新用户信息和新报刊信息的录入功能,信息一旦提交就存入到后台数据库中;普通用户自行注册进行录入个人信息。l (3)订阅功能:用户可以订阅报刊,系统自动计算所需金额,并显示在界面上;管理员不可订阅报刊,必须以用户身份订阅报刊。l (4)查询功能:用户可以查询并显示自己所订阅的信息;管理员可以按人员、报刊、部门分类查询。查询出的信息显示在界面上。l (5)统计功能:管理员可以按用户、部门、报刊统计报刊的销售情况,并对一些重要的订阅信息进行统计;普通用户可以统计出自己的订阅情况。l (6)系统维护功能:管理员可以对用户、报刊、部门、订阅等信息进行添加、删除、更改等维护工作;管理员还要经常备份数据库,以备出现故障后恢复。用户可以更改自己的注册信息,但用户名不能更改。系统框架报刊订阅管理系统主要是由登录、录入、订阅、信息查询、统计、系统维护等主要模块构成。本系统的结构功能图:概念结构设计概念结构设计的方法与步骤概念结构独立于数据库逻辑结构和支持数据库的DBMS。概念结构即概念模型,其主要特点是:(1)概念模型是反映现实世界的一个真实模型。概念模型应能真实,充分反映现实世界,能满足用户对数据的处理要求。(2)概念模型应能易于理解。概念模型只有被用户理解后,才可以与设计者交换意见,参与数据库的设计。(3)概念模型应当易于更改。由于现实世界会发生变化,这就需要改变概念模型,易于更改的概念模型有利于修改和扩充。(4)概念模型应易于向数据模型转换。概念模型最终要转换为数据模型。设计概念模型时应当注意,使其有利于向特定的数据模型转换。概念结构设计的方法设计概念结构通常有四类方法:(1)自顶向下:即首先定义全局概念结构的框架,然后逐步细化。(2)自底向上:即首先定义各局部应用的概念结构,然后将它们集成起来得到全局概念模式。(3)逐渐扩张:首先定义最重要的核心概念结构,然后向外扩充,以滚雪球的方式逐步生成其他的概念结构,直至总体概念结构。(4)混合策略:即将自顶向下和自底向上相结合,用自顶向下策略设计一个全局概念结构的框架,以它为骨架集成由自底向上策略中设计的各局部概念结构。其中最经常采用的策略是自底向上的方法。即自顶向下地进行需求分析,然后再自底向上地设计概念结构。这个报刊订阅系统就用这种方法。概念结构设计的步骤第一步是进行局部视图的设计:由于高层的数据流图只能反映系统的概貌,而中层流图能较好的反映系统中各局部应用的子系统组成。因此我们先逐一的设计分E-R图。第二步是进行视图的集成:各子系统的E-R图设计好之后,下一步就是要将所有的分E-R图合成一个系统的总E-R图,一般有两个方式,多个分E-R图一次集成,另一种是一次集成两个分E-R图。我想采用一次集成两个分E-R图的方式。3.2 数据抽象与局部视图设计本系统采用E-R图(实体-关系图)的方法进行数据库概念结构设计。系统E-R图如下所示:图3.1总体联系各实体属图:部门:图3.2部门实体属性图用户:图3.3用户实体属性图管理员:图3.4管理员实体属性图报刊:图3.5报刊实体属性图关系表E-R图:订阅:图3.6订阅关系管理:图3.7管理关系视图的集成经过逐步细化再进行每两个一集成初步形成一个E-R图,最后得到图3.8总体概念结构E-R图: 图3.8整体E-R图第四章 逻辑结构设计E-R图向关系模型的转换部门(部门号,部门名)用户(用户名,密码,真实姓名,性别,)管理员(管理员名,密码)报刊(报刊代号,报刊名,类型,出版报社价)订阅(用户名,报刊代号,订阅年限,订阅数量,所需金额)此段核心程序用于实现Book表与数据的连接及其用户订阅报刊的功能。void CBookDlg:FillList()CString sCmdText="Select * From paper"_RecordsetPtr m_pRecordSet;trym_pRecordSet.CreateInstance("ADODB.Recordset");m_pRecordSet->Open(_variant_t)sCmdText,(_variant_t)sConn,adOpenStatic,adLockOptimistic,adCmdText);while (!m_pRecordSet->adoEOF)InsertDataToList(LPCTSTR)(_bstr_t)m_pRecordSet->GetCollect("Pname"),(LPCTSTR)(_bstr_t)m_pRecordSet->GetCollect("Ptype"),(LPCTSTR)(_bstr_t)m_pRecordSet->GetCollect("Ppublish"),(LPCTSTR)(_bstr_t)m_pRecordSet->GetCollect("Pprice");m_pRecordSet->MoveNext();m_pRecordSet->Close();catch (_com_error e)CString sTemp;sTemp.Format("%s",e.ErrorMessage(); MessageBox(sTemp);void CBookDlg:InsertDataToList(CString Pname, CString Ptype,CString Ppublish, CString Pprice)int index=m_list.GetItemCount();LV_ITEM IvItem;IvItem.mask=LVIF_TEXT;IvItem.iItem=index;IvItem.iSubItem=0;IvItem.pszText=(char*)(LPCTSTR)Pname;m_list.InsertItem(&IvItem);m_list.SetItemText(index,1,Ptype);m_list.SetItemText(index,2,Ppublish);m_list.SetItemText(index,3,Pprice);int CBookDlg:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CDialog:OnCreate(lpCreateStruct) = -1)return -1;/*/ TODO: Add your specialized creation code hereCRect parentRect;CRect selfRect; this->GetParent()->GetClientRect(parentRect);this->GetClientRect(selfRect);parentRect.right=parentRect.left+selfRect.right-selfRect.left;parentRect.bottom=parentRect.top+selfRect.bottom-selfRect.top; this->MoveWindow(parentRect);*/ TODO: Add your specialized creation code herereturn 0;void CBookDlg:OnClickList(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code herem_SelectedIndexOfList=-1;LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;if(lpNMItemActivate != NULL)m_SelectedIndexOfList = lpNMItemActivate->iItem;/若存在被选中的行if (m_SelectedIndexOfList!=-1)m_name=m_list.GetItemText(m_SelectedIndexOfList,0);m_type =m_list.GetItemText(m_SelectedIndexOfList,1);m_publish=m_list.GetItemText(m_SelectedIndexOfList,2);m_price=m_list.GetItemText(m_SelectedIndexOfList,3);UpdateData(false);*pResult = 0;/不如人意void CBookDlg:OnButtonBook() UpdateData(true);if (m_name="" |m_publish=""|m_num="")MessageBox("数据填写不完整,无法订阅刊物!","提醒!");return;try/int num=atoi(LPCTSTR)m_num);/ _bstr_t sCmdText="Insert book (Aname,Pname,Bint) Values ("+ ConvertCsToCs(hostname)+","+ConvertCsToCs(m_name)+","+ConvertCsToCs(m_num)+")" _variant_t RecordAffected;m_oConn->Execute(sCmdText,&RecordAffected,adCmdText);MessageBox("您的订阅成功,欢迎下次再来订阅!","提醒!");return;catch (_com_error e)CString sTip;sTip.Format("%s",e.ErrorMessage();/CString CBookDlg:ConvertIntToCString(int ID)CString sDes;sDes.Format("%d",ID);return sDes;CString CBookDlg:ConvertCsToCs(CString ch)ch+=""CString ch2=""ch2+=ch;return ch2;此段程序主要用于数据库中的Uuser表连接,并实现用户登录及订阅报刊的信息。void CUserDlg:OnOK() / TODO: Add extra validation hereint i=0;/ TODO: Add extra validation hereUpdateData();OpenConn();/CString sCmdText="select * From Uuser"_RecordsetPtr m_pRecordSet;trym_pRecordSet.CreateInstance("ADODB.Recordset");m_pRecordSet->Open(_variant_t)sCmdText,(_variant_t)sConn,adOpenStatic,adLockOptimistic,adCmdText);while (!m_pRecordSet->adoEOF)bool status=InsertDataToRoomList(LPCTSTR)(_bstr_t)m_pRecordSet->GetCollect("Uname"),(LPCTSTR)(_bstr_t)m_pRecordSet->GetCollect("Upass");if(status!=0) i=1;CDialog:OnOK(); CBookDlg* BDlg=new CBookDlg(this);BDlg->hostname=m_user; BDlg->DoInter();m_pRecordSet->MoveNext();m_pRecordSet->Close();catch (_com_error e)CString sTemp;sTemp.Format("%s",e.ErrorMessage();MessageBox(sTemp); if(i=0) MessageBox("输入的用户名和密码错误!请重新输入!");void CUserDlg:OnCancel() / TODO: Add extra cleanup hereCDialog:OnCancel();bool CUserDlg:OpenConn()/ 连接到MS SQL Server/_ConnectionPtr m_oConn;HRESULT m_hr;bool IsOpen=false;try m_hr=m_oConn.CreateInstance(_uuidof(Connection); m_oConn->CursorLocation=adUseClient;if (!SUCCEEDED(m_hr)MessageBox("连接数据库失败");return false;m_hr=m_oConn->Open(_bstr_t(sConn),"","",-1);return true; catch(_com_error e)/捕捉异常 CString errormessage; errormessage.Format("连接数据库失败!rn错误信息:%s",e.ErrorMessage(); AfxMessageBox(errormessage);/显示错误信息 return false; bool CUserDlg:InsertDataToRoomList(CString Uname, CString Upass)if(m_user="")return 0;CString a = Uname.Left(strlen(m_user);CString b = Upass.Left(strlen(m_upass); int i=strcmp(m_user,a);int j=strcmp(m_upass,b);if(i=0)if(j=0) return 1;elsereturn 0;此段程序用于实现主界面的位图效果显示,首先创建内存设备环境,装入了位图资源后, 将位图对象选入设备环境, 读取位图信息将内存中的位图复制到屏幕上,就显示出主界面的位图效果。void CPubView:OnDraw(CDC* pDC)CPubDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCDC MemDC; MemDC.CreateCompatibleDC(pDC); Bitmap Bitmap; Bitmap.LoadBitmap(IDB_MYBITMAP); CBitmap *pOldBitmap=MemDC.SelectObject(&Bitmap);BITMAP bm; Bitmap.GetObject(sizeof(BITMAP), &bm); pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &MemDC,0, 0, SRCCOPY); MemDC.SelectObject(pOldBitmap);4、运行结果: 登录管理员界面 注册新用户“xuesheng” 管理员增加报刊“西南周报” “xuesheng”登录用户界面 用户订阅西南周末20份 管理员界面显示用户“xuesheng“成功订阅”西南周报20份总结通过这次的数据库课程设计我学习并掌握了很多知识与操作。历时两个星期的设计令我受益匪浅,也对数据库这门学科有了更进一步的认识与熟悉。 一个好的软件的设计必须有一个好的需求分析。我结合自己的设计理念,设计出了六个表,分别是:部门表(department),用户表(CONSUMER),管理员表(ADMINISTRATOR),管理关系表(manage),报刊表(MAGAZINE),订阅表(SUBSCRIBE)。在各个表中我添加了若干个属性,而这些属性恰恰是我们最想知道的信息。当创建完这些表和属性后,我开始按照老师给的模板和要求写论文,写论文的过程中温习了用DB2运行截图,相较于我这是比较难的步骤。我花了很长的时间才弄懂如何使用。我根据老师以前给的实验指导书一步一步的从头到尾开始学习操作应用DB2。弄懂了DB2后,我就开始根据老师的要求进行报刊订阅各个操作。另外,我还自学了用visio画E-R图和模式图,也有所收获。完成之后,很有成就感,学到了很多,希望以后还可以有这样的课程设计让我进步。由于本人能力不足,难免会使系统出现一些不足之处,但由于限于时间,本系统只能做出其中的一部分功能。希望老师评点批评