资源描述
《数据库信息系统开发》
课
程
设
计
报
告
学号: 1204020108
姓名: 谭 经 涛
班级: 2012级01班
专业: 计算机信息管理
学院: 商 学 院
咸宁职业技术学院
2014年12月1日
课程设计报告
图书管理系统之图书续借与归还模块
一、课程设计任务:
图书续借与归还模块的实施与测试的任务如下表所示。
任务名称
图书续借与归还模块的实施与测试
模块名称
图书续借与归还
窗体名称
frmBookReturnOrRenew
业务处理层的类名称
returnOrRenewClass
数据表名称
借阅信息、图书信息
数据操作层的类名称
bookDBClass
任务说明
(1)创建图书续借与归还模块的类
(2)设计图书续借与归还应用程序界面
(3)编写图书续借与归还模块的程序代码
(4)测试图书续借与归还程序
模块主要功能简述
(1)提供凭证续借与归还、凭书续借或归还两种方式。
(2)借阅者或图书的输入或选择可能通过输入借阅者编号+回车或者使用条码扫描器扫描输入或者打开【选择已借出图书】窗口双击选择完成。
(3)对于凭证续借与归还的方式,可以从“借阅者信息”数据表中选择任一位借阅者,但是只能从所选择借阅者的已借出图书列表中选择一本图书续借或归还。
(4)对于凭书续借与归还的方式,可以从“借阅信息”数据表中选择任一本已借出图书,而借阅者编号与所选择图书的借阅者对应,图书借阅员不能自由选择。
二、课程设计准备:
(一)图书借出与归还模块的建模
(1)“图书借出与归还”模块的用例图如下所示:
(2)“图书借出类”的类图如下所示:
“图书借出与归还”模块的用例图 “图书借出类”的类图
(3)“图书借出界面类”的类图如下所示:
“图书借出界面类”的类图
(4)“图书”的状态图如下所示:
“图书”的状态图
(5)“图书借出”的顺序图如下所示:
“图书借出”的顺序图
(6)“图书借出”的活动图如下所示:
“图书借出”的活动图
(7)“图书借出”的协作图如下所示:
“图书借出”的协作图
(二)创建图书续借与归还模块的数据表与数据视图
(1)借阅信息数据表的结构设计及相关数据如下:
(2)创建图书信息数据表的结构设计及相关数据如下:
(3)在数据库“bookData”中创建一个数据视图“loanView”,该视图的结构信息及相关数据如下:
三、课程设计实施:
(一)创建图书借出应用程序的解决方案和多个项目
(1)创建应用程序解决方案
启动Microsoft Visual Studio.NET 2008,显示系统的集成开发环境。在【Microsoft Visual Studio】集成开发环境中,创建应用程序解决方案“bookMis”。
(2)创建数据库访问项目
创建一个数据库访问项目“bookDB”。
(3)创建业务处理项目
创建一个业务处理项目“bookApp”。
(4)创建应用程序项目
创建一个应用程序项目“bookUI”。
(二)创建图书续借与归还模块的类
在现有类库bookApp中添加新类returnOrRenewClass,编写类方法的程序代码。
bookDB类库中bookDBClass类对象的声明代码如下;
bookDB.bookDBClass objBookDb = new bookDB.bookDBClass();
(1)方法getLoanInfoByBarcode的程序代码如下;
public DataTable getLoanInfoByBarcode(string barcode)
{
return objBookDb.getDataBySQL("Select 借阅编号,借阅者编号, " +
" 姓名,图书条码,图书名称,借出日期,应还日期,续借次数, 图书 阅员 " +
" From loanView Where 图书条码='" + barcode + "' Order by 借阅编号");
}
(2)方法loanRenew的程序代码如下;
public bool loanRenew(int maxDay, string borrowerId, string bookBarcode)
{
string strSql = null;
strSql = "Update 借阅信息 Set 借出日期='
"+DateTime.Today.ToShortDateString()+ "',应还日期='"
+ DateTime.Now.AddDays(maxDay).Date.ToShortDateString()
+ "',续借次数=续借次数+1 where 借阅者编号='"
+ borrowerId + "' And 图书条码='" + bookBarcode + "'";
return objBookDb.updateDataTable(strSql);
}
(3)方法loanDelete的程序代码如下;
public bool loanDelete(string borrowerId, string bookCode)
{
string strSql = null;
strSql = "Delete From 借阅信息 Where 借阅者编号='" +
borrowerId + "' And 图书条码='" + bookCode + "'";
if (objBookDb.updateDataTable(strSql) == true)
{
return true;
}
else
{
return false;
}
}
(4)方法bookNowNumAdd的程序代码如下;
public object bookNowNumAdd(string bibliothecaId)
{
string strEditComm = null;
strEditComm = "Update 书目信息 Set 现存数量=现存数量+1 " +
"Where 书目编号= '" + bibliothecaId + "'";
return objBookDb.updateDataTable(strEditComm);
}
(三)图书续借与归还的界面设计
在现有项目bookUI中添加2个Windows窗体:【图书续借与归还】窗体(该窗体的变量名称为frmBookReturnOrRenew)和【选择已借出图书】窗体(该窗体的变量名称为frmSelectLoanBook)。
【图书续借与归还】窗体的外观设计如图所示;
【图书续借与归还】窗体的外观设计
(四)编写图书续借与归还窗体的程序代码
(1)添加引用
将类库bookApp添加到类库bookUI的引用中。
在【解决方案资源管理器】窗口中,在类库名称“BookUI”位置单击右键,在弹出的的快捷菜单中单机选择菜单命令【添加引用】,打开【添加引用】对话框,在该对话框中选择“BookApp”,然后单击确定按钮,即可将“BookApp”添加到【解决方案资源管理器】窗口的“引用”列表中。
(2)声明窗体级变量
声明窗体级变量的程序代码如下;
public string flagBorrow;
bookApp.returnOrRenewClass objReturnOrRenew =
new bookApp.returnOrRenewClass();
bookApp.loanClass loanObj = new bookApp.loanClass();
string borrowerId;
string bookBarcode;
string bibliothecaId;
(3)编写方法getBorrowerLoanInfo的程序代码
方法getBorrowerLoanInfo的程序代码如下;
private void getBorrowerLoanInfo()
{
if (loanObj.isOverdue(borrowerId) == true)
{
DataTable dt = new DataTable();
dt = loanObj.getLoanInfo(borrowerId);
if (dt.Rows.Count != 0)
{
dgLoanInfo.DataSource = dt;
btnGetBookBarcode.Enabled = false;
}
else
{
dgLoanInfo.DataSource = null;
dgLoanInfo.Refresh();
}
}
else
{
MessageBox.Show("你已经有超期图书了,请归还再借!",
"提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
(4)编写方法getBook的程序代码
方法getBook的程序代码如下;
private void getBook()
{
DataTable dt = new DataTable();
dt = loanObj.getBookInfo(bookBarcode);
if (dt.Rows.Count != 0)
{
txtBookName.Text = dt.Rows[0]["图书名称"].ToString();
txtPublisher.Text = dt.Rows[0]["出版社名称"].ToString();
txtAuthor.Text = dt.Rows[0]["作者"].ToString();
bibliothecaId = dt.Rows[0]["书目编号"].ToString();
}
}
(5)编写方法clearControl的程序代码
方法clearControl的程序代码如下;
private void clearControl()
{
txtBookBarcode.Text = "";
txtBookName.Text = "";
txtPublisher.Text = "";
txtAuthor.Text = "";
}
(6)编写【图书续借与归还】窗体Load事件过程的程序代码
【图书续借与归还】窗体bookReturnOrRenew的Load事件过程的程序代码如下;
private void frmBookReturnOrRenew_Load(object sender, EventArgs e)
{
if (flagBorrow == "renew")
{
this.Text = "续借图书";
btnBookRenew.Enabled = true;
btnBookReturn.Enabled = false;
}
else
{
this.Text = "归还图书";
btnBookRenew.Enabled = false;
btnBookReturn.Enabled = true;
}
txtBookName.Enabled = false;
txtPublisher.Enabled = false;
txtAuthor.Enabled = false;
txtBorrowerId.Focus();
DataGridViewCellStyle headerStyle = new DataGridViewCellStyle();
headerStyle.Alignment=
System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
this.dgLoanInfo.ColumnHeadersDefaultCellStyle = headerStyle;
}
(7)编写“选择借阅者”按钮的Click事件过程的程序代码
“选择借阅者”按钮btnGetBorrower的Click事件过程的程序代码如下;
private void btnGetBorrower_Click(object sender, EventArgs e)
{
txtBookName.Enabled = false;
txtPublisher.Enabled = false;
txtAuthor.Enabled = false;
txtBorrowerId.Focus();
DataGridViewCellStyle headerStyle = new DataGridViewCellStyle();
headerStyle.Alignment
=System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
this.dgLoanInfo.ColumnHeadersDefaultCellStyle = headerStyle;
}
(8)编写“借阅者编号”文本框的KeyDown事件过程的程序代码
“借阅者编号”文本框txtBorrowerId的KeyDown事件过程的程序代码如下;
private void txtBorrowerId_KeyDown(object sender,Key EventArgs e)
{
if(e.KeyCode==Keys.Enter)
{
if(txtBorrowerId.Text.Trim().Length>=5)
{
borrowerId=txtBorrowerId.Text.Trim();
getBorrowerLoanInfo();
}
}
}
(9)编写“选择图书”按钮的Click事件过程的程序代码
“选择图书”按钮btnGetBookBarcode的Click事件过程的程序代码如下;
private void btnGetBookBarcode_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
frmSelectLoanBook frmLoanBook = default(frmSelectLoanBook);
Point startLocation = new Point();
startLocation.X = this.Location.X + txtBorrowerId.Location.X;
startLocation.Y = this.Location.Y + txtBookBarcode.Location.Y+50;
frmLoanBook = new frmSelectLoanBook(startLocation);
frmLoanBook.ShowDialog();
bookBarcode = frmLoanBook.getLoanBookId();
txtBookBarcode.Text = bookBarcode;
getBook();
dt = objReturnOrRenew.getLoanInfoByBarcode(bookBarcode);
txtBorrowerId.Text = dt.Rows[0][1].ToString();
dgLoanInfo.DataSource = dt;
btnGetBorrower.Enabled = false;
txtBorrowerId.Enabled = false;
}
(10)编写“图书条码”文本框的KeyDown事件过程的程序代码
“图书条码”文本框txtBookBarcode的KeyDown事件过程的程序代码如下;
Private void txtBookBarcode_KeyDown(object sender,KeyEventArgs e)
{
if(e.KeyCode==Keys.Enter)
{
bookBarcode=txtBookBarcode.Text.Trim();
getBook();
if(btnGetBookBarcode.Enabled==true)
{
DataTable dt=new DataTable();
dt=objReturnOrRenew.getLoanInfoByBarcode(bookBarcode);
txtBorrowerId.Text=dt.Rows[0][1].ToString();
dgLoanInfo.DataSource=dt;
btnGetBorrower.Enable=false;
txtBorrowerId.Enabled = false;
}
}
}
(11)编写DataGridView控件的DoubleClick事件过程的程序代码
DataGridView控件dgLoanInfo的DoubleClick事件过程的程序代码如下;
private void dgLoanInfo_DoubleClick(object sender,EventArgs e)
{
bookBarcode=dgLoanInfo.Rows[dgLoanInfo.CurrentRow.Index].Cells[2]
.Value.ToString();
txtBookBarcode.Text=bookBarcode;
getBook();
}
(12)编写【续借图书】按钮的Click事件过程的程序代码
【续借图书】按钮btnBookRenew的Click事件过程的程序代码如下;
private void btnBookRenew_Click(object sender, EventArgs e)
{
string strCardState = null;
int maxDay = 0;
DataTable dt = new DataTable();
if (checkEmpty() == false)
{
return;
}
dt = loanObj.getBorrowerInfo(borrowerId);
maxDay = Convert.ToInt32(dt.Rows[0]["最长借书期限"]);
strCardState = dt.Rows[0]["借书证状态"].ToString();
switch (strCardState)
{
case "有效":
if (objReturnOrRenew.loanRenew(maxDay, borrowerId,
bookBarcode) == true)
{
dgLoanInfo.DataSource = null;
dgLoanInfo.DataSource = loanObj.getLoanInfo(borrowerId);
dgLoanInfo.Refresh();
MessageBox.Show("图书续借成功!", "提示信息",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("图书续借失败!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Question);
return;
}
break;
case "挂失":
MessageBox.Show("读者的借书证已被挂失,不能继续使用!",
"提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
case "停用":
MessageBox.Show("读者的借书证已被停用,不能继续使用!",
"提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
btnGetBorrower.Enabled = true;
}
(13)编写【归还图书】按钮的Click事件过程的程序代码
【归还图书】按钮btnBookReturn的Click事件过程的程序代码如下;
private void btnReturn_Click(object sender, EventArgs e)
{
if (objReturnOrRenew.loanDelete(borrowerId, bookBarcode) == true)
{
loanObj.setBookState(bookBarcode, "在藏");
objReturnOrRenew.bookNowNumAdd(bibliothecaId);
dgLoanInfo.DataSource = null;
dgLoanInfo.DataSource = loanObj.getLoanInfo(borrowerId);
dgLoanInfo.Refresh();
clearControl();
MessageBox.Show("图书归还成功!", "提示信息",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("图书归还失败!", "提示信息",
MessageBoxButtons.OK, MessageBoxIcon.Question);
}
}
(五)选择已借出图书的窗体设计
(1)设计【选择已借出图书】窗体的外观
【选择已借出图书】窗体的外观设计如图所示,该窗体主要包括1个DataGridView控件。
【选择已借出图书】窗体的外观设计
(2)编写【选择已借出图书】窗体的程序代码
声明窗体级变量的程序代码如下;
bookApp.loanClass objLoan=new bookApp.loanClass();
Data Table dt=new DataTable();
Point startLocation;
【选择已借出图书】窗体的程序代码如下;
public frmSelectLoanBook(Point winLocation)
{
IntializeComponet();
startLocation=winLocation;
}
方法getLoanBookId的程序代码如下;
public string getLoanBookId()
{
Return dt.Rows[dataGridView1.CurrentRow.Index][“图书条码”].ToString();
}
【选择已借出图书】窗体frmSelectLoanBook的Load事件过程的程序代码如下;
private void frmSelectLoanBook_Load(object sender,EventArgs e)
{
this.FormBorderStyle=FormBorderStyle.None;
this.Location=new Point(startLocation.X, startLocation.Y);
dt=objLoan.getLoanInfo(“”);
dataGridView1.DataSource=dt.DefaultView;
}
DataGridView控件的DoubleClick事件过程的程序代码只有一条语句,如下所示;
this.DialogResult = DialogResult.Yes;
四、课程设计测试:
(一)设置启动图书续借与归还模块项目和启动对象
(1)将“bookUI”为启动项目,
(2)将窗体“frmBookReturnOrRenew”设置为启动对象。
(二)用户界面测试
(1) 测试内容:用户界面的视觉效果和易用性;控件状态、位置及内容确认;光标移动顺序。
(2) 确认方法:屏幕拷贝、目测,【续借图书】窗体运行的初始状态如下图所示。
(3) 测试结论:合格
【图书续借与归还】窗体运行的初始状态
(三)功能测试
功能测试的目的是测试任务卡中的功能要求是否能够实现,同时测试【图书续借与归还】模块的容错能力。
(1)准备测试用例。
准备的测试用例如下表;
序号
测试数据
预期结果
借阅者编号
姓名
图书条码
图书名称
1
201303020108
杨乙
00050419
UML基础与Rose建模案例
成功续借图书
2
201303020110
丁一
00050406
网页设计与制作案例教程
成功续借图书
3
201303020110
丁一
00050406
网页设计与制作案例教程
成功续借图书
(2)测试使用有效借书证成功续借图书。
①测试内容:对于有效借书证,成功续借图书。
②确认方法:屏幕拷贝、目测。
③测试过程。
在【续借图书】窗口中,单击“借阅者编号”文本框右侧的【…】按钮,显示的“选择借阅者”窗口,在该窗体中双击选择编号为“201303020108”的借阅证。
在【续借图书】窗口中双击“借出图书”列表中的《UML基础与Rose建模案例》图书,在该窗口右侧显示该图书的相关数据。
接着在【续借图书】窗口中单击【续借图书】按钮,续借图书成功,弹出“图书续借成功!”的【提示信息】对话框,在该对话框中单击【确定】按钮,完成图书续借。
④测试结论:合格。
(3)测试使用有效借书证成功归还图书
①测试内容:对于有效借书证,成功续借图书。
②确认方法:屏幕拷贝、目测。
③测试过程。
首先打开【图书借出】窗口,在该窗口中借阅者“丁一”成功借出一本图书《网页设计与制作案例教程》。
然后打开【归还图书】窗口,在该窗口的“借阅者编号”文本框中输入编号“201303020110”
按回车键,显示“丁一”的借书记录。
在【归还图书】窗口双击“借出图书”列表中的《网页设计与制作案例教程》图书,在该窗口右侧显示该图书的相关数据。
在【归还图书】窗口单击【归还图书】按钮,归还图书成功,弹出“图书归还成功”的【提示信息】对话框,在对话框中单击【确定】按钮,完成图书归还。
④测试结论:合格。
14
展开阅读全文