软件工程课程设计任务书——图书管理系统

更新时间:2023-08-09 13:47:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

软件工程课程设计——

图书馆管理系统

09计算机一班 苏冬(20090610040122) 陈志辉

一、实验目的

本学期数据库课程设计的题目为数据库的应用,建立一个系统界面来调用数据库中的数据。众所周知数据库是用来提高对数据的操作,大部分的应用程序都需要调用数据库中的数据,所以能够应用数据库对编写应用程序尤为重要。所以这次课程设计需要学习数据库怎样通过连接被应用程序调用,可以通过ADO、ODBC、OLEDB等进行连接;怎样能够编写代码将界面的文本文档控件的输入信息转化为数据库的信息;怎样通过查询数据库里的内容判断是否有一条记录信息......。

本课程设计设计一个图书借阅管理系统,通过一个管理员登陆界面,进入主界面后进行查询、导入、删除学生图书借阅信息,而界面显示的数据将放在数据库中保存。

二、实验要求

基本要求:实现图书管理和借阅。图书管理包括图书的增加和删除;图书借阅包括图书的查询、借、还。

高级要求:具有用户管理功能,如增加用户、删除用户等;能设置图书借阅的最长时间限制,对超出时间的进行罚款。

三、分工情况

苏冬:界面设计,借还书及相关查询

陈志辉:数据库设计,数据库管理,读者信息登记及查询,界面登录

四、实验的硬件环境、软件环境

硬件环境:Windows 7

软件环境:visual C++ 6.0

五、实验步骤

可行性分析报告

我们小组的软件工程开发课程设计题目是:图书管理系统开发。系统开发的总的设计目标是实现图书管理的系统化、规范化和自动化,实现对图书资料的集中统一的管理。 本系统主要实现对图书馆信息的管理,主要功能为管理有关读者,书籍,借阅和管理者的信息等。本系统结构分为读者信息管理模块,书籍信息管理模块,借阅信息管理模块,管理者信息管理模块。读者信息管理部分有两方面的功能,可以浏览读者的信息,可以对读者信息进行维护。书籍信息管理可以浏览书籍的信息,可以对书籍信息进行维护。借阅信息管理可以显示当前数据库中书籍借阅情况,可以对借阅信息进行维护。管理者信息管理可以显示数据库中管理者的情况,可以对管理者信息进行维护。可见,本系统并不复杂,主要解决的问题是利用关键字对数据库进行查询。

概要设计

软件工程课程设计——

5.1.1数据库设计

数据库的数据项由如下组成:

登录表:

用户名、密码。 图书表:

图书条码、图书名称、作者、出版社、出版时间、图书馆图书是否还可借出。 借阅表:

借阅ID、读者条码、图书条码、借阅时间、借出批准图书管理员。 历史借阅表:

历史借阅ID、读者条码、图书条码、借阅时间、归还时间、借出图书馆员、借出图书管理员。 读者表:

读者条码、读者姓名、身份证号、最大借书数量、是否借书。

5.1.2界面功能设计

完成如下几项功能:

1)图书管理

A、查询图书信息:通过图书或书籍条码查询;

B、增添图书信息:输入书名、作者、书籍条码、出版社、出版日期、图书馆尚能借出与否等信息增添图书。

C、删除图书信息:通过查询删除下架的图书。

D、图书记录查询:通过录入的图书信息顺序,查看上一条、下一条、第一条、末条记录。 2)读者管理

A、查询读者信息:通过输入读者姓名,读者条码查询,名字可以相同,读者条码唯一。

B、增添读者信息:输入读者条码、读者姓名、读者身份证号信息增添读者。

C、删除读者信息:通过查询的结果删除不能借阅图书的读者信息。 D、读者记录查询:通过录入的读者信息顺序,查看上一条、下一条、第一条、末条记录。 3)借书管理

A、借书信息录入:输入读者条码和图书条码,完成借书,将在借书表中记录读者的借书信息,并通过管理员的登录信息生成借书批准员。 4)还书管理

A、历史借书录入:输入图书条码、读者姓名核对是否有借书记录,然后调用借书日期和现在时间生成借书时间并判断是否超期借阅,将信息录入数据库中。 5)登录管理

A、通过编辑数据库中clerk表添加登录账号和密码。

详细设计(每个题目的设计流程和算法描述)

5.2.1数据库详细设计

软件工程课程设计——

首先设计数据库定义图书借阅管理的数据项,将数据分为几张不同的关系表进行存放,表与表之间存在数据关系,通过连接可查询不同的组合信息,他们的关系ER图如下

:

本次课程设计是通过ACCESS建立数据库并通过ODBC控件方式挂载数据库服务(DSN服务、注是将.mdb格式的数据库文本挂载),通过代码调用上述所提供的DSN服务对数据库中的内容进行操作。挂载DSN服务和通过access建立的数据库表如下

:

软件工程课程设计——

READER表是图书馆读者表,包含读者全部信息;BOOK表是图书馆图书信息表,包含图书馆全部图书信息;BORROW表是读者借阅情况表,包含所有借阅信息;HISTORY表是历史借阅表,包含借阅和归还日期等所有历史借阅信息;CLERK表是管理员账号信息表,记录登录信息;表中有各自相应的描述属性。

5.2.2界面详细设计

界面是通过MFC编写的,界面操作的数据流如下图所示:

软件工程课程设计——

界面通过数据库的登录信息表(CLERK表)登录到主界面,然后可在主界面对不同的表进行操作来管理操作图书信息、读者信息、借阅信息、图书归还信息。 详细的界面如下

:

管理员登录界面

查询CLERK表,表中有记录才能可以登录。 主界面如下图

主管理界面

通过7个按钮控件进入不同的对话框,旁边有相应的注释信息。

软件工程课程设计——

新书登记界面

图书查询界面

图书借阅

软件工程课程设计——

还书界面

对BOOK表进行查询、登记、借阅、归还操作。

读者登记

读者信息查询

软件工程课程设计——

读者信息删除

对READER表进行增加、删除、查询操作。

罚款设置

设置图书借阅的最长时间限制,对超出时间的进行罚款

5.2.3部分后台代码实现举例

A、登录信息的实现:

UpdateData(TRUE); if (m_strName.IsEmpty()) /*判断用户名信息是否为空*/ { AfxMessageBox("请输入用户名!"); return; } mSqlStr = "SELECT * FROM CLERK WHERE NAME='"; mSqlStr = mSqlStr + m_strName; mSqlStr = mSqlStr + "' AND PASSWORD='"; mSqlStr = mSqlStr + m_strPassword; mSqlStr = mSqlStr + "'";

软件工程课程设计——

{ AfxMessageBox("CLERK表打开失败!"); return; }

if (!mrsDataSet.IsEOF()) { // Open all function for user CDialog::OnOK(); } else { AfxMessageBox("密码错误,请重新输入!"); return; }

通过这条语句mSqlStr = "SELECT * FROM CLERK WHERE NAME='m_strName'AND PASSWORD= 'm_strPassword'";查询CLERK表(管理员登录表)信息,实现用户登录。 B、图书查询代码实现:

UpdateData(TRUE); if (m_strBookIDQ.IsEmpty() && m_strBookNameQ.IsEmpty()) { m_rsDataSet.m_strFilter = ""; m_rsDataSet.Requery(); DisplayRecord(); SetButtonState(); AfxMessageBox("请输入相关的查询信息!"); return; } BOOL mAll = FALSE; if (!m_strBookIDQ.IsEmpty()) { m_rsDataSet.m_strFilter = "BOOK_ID='" + m_strBookIDQ ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; mAll = TRUE; } if (!m_strBookNameQ.IsEmpty()) { if (mAll) { m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + " AND BOOK_NAME='";

软件工程课程设计——

m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; } else { m_rsDataSet.m_strFilter = "BOOK_NAME='" + m_strBookNameQ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; } }

m_rsDataSet.Requery(); DisplayRecord(); SetButtonState();

通过传递m_rsDataSet.m_strFilter="BOOK_ID='m_strBookIDQ AND BOOK_NAME=m_strBookNameQ"这个条件实现查询。 C、连接数据库使数据能够读出和导入

CBookDataSet::CBookDataSet(CDatabase* pdb) : CRecordset(pdb) { //{{AFX_FIELD_INIT(CBookDataSet) m_BOOK_ID = _T(""); m_BOOK_NAME = _T(""); m_AUTHOR = _T(""); m_PRESS = _T(""); m_FLAG_BORROW = _T(""); m_nFields = 6; //图书信息的初始化 //}}AFX_FIELD_INIT m_nDefaultType = snapshot; }

CString CBookDataSet::GetDefaultConnect() { return _T("ODBC;DSN=Library"); //连接数据库 }

CString CBookDataSet::GetDefaultSQL() { return _T("[BOOK]"); }

void CBookDataSet::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CBookDataSet) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Text(pFX, _T("[BOOK_ID]"), m_BOOK_ID); RFX_Text(pFX, _T("[BOOK_NAME]"), m_BOOK_NAME); RFX_Text(pFX, _T("[AUTHOR]"), m_AUTHOR); RFX_Text(pFX, _T("[PRESS]"), m_PRESS); RFX_Text(pFX, _T("[PRESS_DATE]"), m_PRESS_DATE); RFX_Text(pFX, _T("[FLAG_BORROW]"), m_FLAG_BORROW);//将数据库中数据和界面文本控件关联起来 //}}AFX_FIELD_MAP }

/******************************************************************************************/

void CBookDlg::OnSave()

{ // TODO: Add your control notification handler code here

软件工程课程设计——

UpdateData(TRUE); if (m_strBookID.IsEmpty() || m_strBookName.IsEmpty()) { AfxMessageBox("请输入相应数据!"); return; } if (m_bAdd) { m_rsDataSet.AddNew(); } else { m_rsDataSet.Edit(); } m_rsDataSet.m_AUTHOR = m_strAuthor; m_rsDataSet.m_BOOK_NAME = m_strBookName; m_rsDataSet.m_BOOK_ID = m_strBookID; m_rsDataSet.m_PRESS = m_strPress; m_rsDataSet.m_FLAG_BORROW = m_strFlag; m_rsDataSet.m_PRESS_DATE=m_strPressDate; //将文本控件的CString类型的数据赋值给数据库关联的变量 实现数据录入 m_rsDataSet.Update(); m_rsDataSet.Requery(); m_bAdd = FALSE; m_bEdit = FALSE; DisplayRecord(); SetButtonState(); SetTextState();

}

源程序(部分)

// Library.cpp : Defines the class behaviors for the application. //

#include "stdafx.h" #include "Library.h"

#include "MainFrm.h" #include "LibraryDoc.h" #include "LibraryView.h" #include "LoginDlg.h"

#include ".\skins\SkinPlusPlus.h"

#ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

软件工程课程设计——

///////////////////////////////////////////////////////////////////////////// // CLibraryApp

BEGIN_MESSAGE_MAP(CLibraryApp, CWinApp) //{{AFX_MSG_MAP(CLibraryApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CLibraryApp construction

CLibraryApp::CLibraryApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance }

///////////////////////////////////////////////////////////////////////////// // The one and only CLibraryApp object

CLibraryApp theApp;

///////////////////////////////////////////////////////////////////////////// // CLibraryApp initialization

BOOL CLibraryApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",

软件工程课程设计——

"DSN=LibraryDB\0" "Description=Hotel\0" "FileType=Access\0" "DBQ=.\\LibDB.mdb\0" ); #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(); // Load standard INI file options (including MRU) //InitializeSkin(_T("XPCorona.ssk")); // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CLoginDlg loginDlg; if(loginDlg.DoModal()!=IDOK) return FALSE; CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CLibraryDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CLibraryView)); AddDocTemplate(pDocTemplate); // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); m_pMainWnd->SetWindowText("华东交通大学图书管理系统");

软件工程课程设计——

return TRUE; }

///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About

class CAboutDlg : public CDialog {

public: CAboutDlg();

// Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

// Implementation protected: //{{AFX_MSG(CAboutDlg) // No message handlers //}}AFX_MSG DECLARE_MESSAGE_MAP() };

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT }

void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP }

软件工程课程设计——

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP()

// App command to run the dialog void CLibraryApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); }

///////////////////////////////////////////////////////////////////////////// // CLibraryApp message handlers

六、软件部分功能测试

读者登记

软件工程课程设计——

读者查询结果

查询结果

六、总结

懂得如何建立数据库是软件设计的基础,在该课程设计中,我们充分考虑并分析了图书管理的各种细节问题,并通过所学的相关知识将其一一解决。

在设计当中,最繁琐的事情莫过于编程了,由于所学知识有限再加上自己的学艺不精,所以在设计开发中出了不少的问题,还好在同学的帮助下,我们顺利的完成了任务,在次次课程设计中,自己积累了不少的经验及知识。

本文来源:https://www.bwwdw.com/article/wknj.html

Top