图书管理系统设计与实现C#经典案例.docx
《图书管理系统设计与实现C#经典案例.docx》由会员分享,可在线阅读,更多相关《图书管理系统设计与实现C#经典案例.docx(67页珍藏版)》请在冰点文库上搜索。
图书管理系统设计与实现C#经典案例
图书管理系统的设计
一、系统分析
1.开发背景
随着人们知识层次的提高,图书馆成为日常生活中不可缺少的一部分。
而图书馆的存数量和业务量庞大,仅仅靠传统的记账式管理是不可行的。
图书馆管理系统应运而生,逐渐成为信息化建设的重要组成部分。
图书馆管理系统为学校或社会型图书馆的管理员提供所有借阅者的详细信息,以及馆内库存的详细情况,对借书和还书两大功能进行合理操纵并登记。
2.需求分析
经过仔细分析系统需求之后,本图书管理系统主要完成的主要功能如下:
●进入系统前需要身份验证、用户名、密码,输入正确后方可进入。
●用户可以根据需要进行书库管理。
●用户可以进行借书证的办理、查询、挂失等操作。
●用户可以添加账户和修改密码。
●身份验证:
提供系统的访问控制功能。
●书库管理:
包括新书登记、借书、还书、书籍挂失、图书信息查询、借书信息查询等功能。
●借阅证管理:
提供办理借阅证、借阅证信息查询、借阅证挂失功能。
●系统管理功能:
包括添加账号、修改密码和退出系统等功能。
二、系统设计
1.系统总体结构
通过对图书管理系统的功能分析,可以定义出系统的功能模块图如下:
2.数据库设计
●管理员基本信息表
字段名称
数据类型
可否为空
约束条件
说明
WorkID
int
NOTNULL
主键
成员ID
User_Name
VARCHAR(24)
NOTNULL
无
姓名
Password
VARCHAR(24)
NOTNULL
无
密码
●图书信息表
字段名称
数据类型
可否为空
约束条件
说明
Book_ID
VARCHAR(50)
NOTNULL
主键
书籍ID
Book_Name
VARCHAR(50)
NOTNULL
无
书名
Writer
VARCHAR(50)
NOTNULL
无
作者
Press
VARCHAR(50)
NOTNULL
无
出版社
Price
float
NOTNULL
无
单价
InLibrary_Date
datetime
NOTNULL
无
入库时间
Total_Amount
int
NOTNULL
无
总量
Now_Amount
int
NOTNULL
无
现存量
●借阅卡信息表
字段名称
数据类型
可否为空
约束条件
说明
Proof_ID
VARCHAR(50)
NOTNULL
主键
借阅卡ID
Name
VARCHAR(50)
NOTNULL
无
姓名
Sex
VARCHAR(50)
NOTNULL
无
性别
Birth_Time
datetime
NOTNULL
无
出生日期
Address
VARCHAR(50)
NOTNULL
无
地址
ID_Number
VARCHAR(50)
NOTNULL
无
身份证号
Tel_Number
VARCHAR(50)
NOTNULL
无
电话号码
Now_Borrow_Amount
int
NOTNULL
无
现借书量
●借书信息表
字段名称
数据类型
可否为空
约束条件
说明
BorrowID
int
NOTNULL
主键
借书ID
Proof_ID
VARCHAR(50)
NOTNULL
外键(Proof_Info)
借书卡ID
Book_ID
VARCHAR(50)
NOTNULL
外键(Book_Info)
书籍ID
Borrow_Date
datetime
NOTNULL
无
借出时间
●罚单信息表
字段名称
数据类型
可否为空
约束条件
说明
Puni_ID
int
NOTNULL
主键
罚单ID
Proof_ID
VARCHAR(50)
NOTNULL
无
借书卡ID
Book_ID
VARCHAR(50)
NOTNULL
无
书籍ID
Borrow_Date
datetime
NOTNULL
无
借出时间
Return_Date
datetime
NOTNULL
无
还书时间
Puni_Money
float
NOTNULL
无
罚金
3.编码设计
●WorkID,BorrowID,Puni_ID都设置了标识规范,增加记录时自动加1,保持其唯一性。
●Borrow_Date,Return_Date,InLibrary_Date都设置成datetime类型,插入记录时自动获取当前日期,不需要管理员输入日期。
●Proof_ID,Book_ID,ID_Number,Tel_Number,Proof_ID由于它们只是代表一个标识,不是一个表示大小的数字,所以用VARCHAR类型,用int或long可能会有溢出现象。
三、系统实施
1.登录
●功能说明:
验证管理员的用户名和密码是否正确,正确则进入主界面。
●源代码:
头文件:
usingSystem.Data.SqlClient;
连接数据库:
SqlConnectioncon=newSqlConnection("server=20100310-1827\\SQLEXPRESS;database=Library;IntegratedSecurity=True");
程序主体:
privatevoidbutton_exit_Click(objectsender,EventArgse)//退出
{
Application.Exit();
}
privatevoidbutton_log_Click(objectsender,EventArgse)//登录
{
if(this.UserName.Text.Trim()==""||this.PassWord.Text.Trim()=="")
MessageBox.Show("用户名和密码都不能为空!
");
if(con.State==ConnectionState.Closed)
con.Open();
Stringstr="selectcount(*)fromAdmin_InfowhereUser_Name='"+this.UserName.Text.Trim()+
"'andPassword='"+this.PassWord.Text+"'";
SqlCommandcom=newSqlCommand(str,con);
inti=Convert.ToInt32(com.ExecuteScalar());
if(i>0)
{
Form2form2=newForm2();//系统主界面
form2.Show();
this.Visible=false;
}
else
{
MessageBox.Show("用户名或密码输入有误,请重新输入!
");
this.UserName.Text="";
this.PassWord.Text="";
}
}
●界面演示:
登录名和密码正确的话进入系统主界面(图一);登录名或者密码不正确的话会弹出提示对话框,并将用户名、密码栏置空(图二);如果用户名或者密码有空,弹出对话框并将用户名、密码栏置空(图三)。
图1图2图3图4
2.系统主界面
●功能说明:
选择各个功能模块
●源代码:
privatevoidForm2_FormClosing(objectsender,FormClosingEventArgse)
{
Application.Exit();
}
privatevoidbutton_exit_Click(objectsender,EventArgse)
{
Application.Exit();
}
privatevoidbutton_new_book_Click(objectsender,EventArgse)
{
Form3form3=newForm3();//新书登记
form3.Show();
}
//初始化对应界面,和上面类似,不再赘述
……
●界面演示:
如图4
3.书库管理
1)新书登记:
●功能说明:
入库的实现过程是首先要输入书籍的各种信息,包括书的书号、书名、作者、出版社、价钱、总量、现存量等,这里书的数量由两个变量来记录,总量代表图书馆中这种这种书的总量,现存量是目前正在管中的量,两者之差就是被读者借出去的数量。
其中每个信息不能有遗漏或者格式不正确,因为这是每一本书的基本信息,在函数的实现过程中有检验的功能。
然后判断图书馆中是否存在这种图书,如果存在,那么时间简单的把库存的数量加上新加入的数量,如果不存在,那么就要新建记录。
●源代码:
连接数据库:
SqlDataAdapterda=newSqlDataAdapter();
DataSetds=newDataSet();
程序主体:
//主界面调用的每个模块的返回按钮都是隐藏本体,以后不再写出返回按钮的操作带代码
privatevoidbutton_back_Click(objectsender,EventArgse)//返回
{
this.Visible=false;
}
privatevoidbutton_in_Click(objectsender,EventArgse)//入库
{
intres;
//检验输入数据是否合法
if(this.textBox_book_no.Text.Trim()==""||this.textBox_name.Text.Trim()==""
||boBox_press.Text.Trim()==""||this.textBox_price.Text.Trim()==""
||this.textBox_total.Text.Trim()==""||this.textBox_writer.Text.Trim()=="")
{
MessageBox.Show("请正确填写要求的数据!
","新书入库登记");
this.textBox_book_no.Text="";
this.textBox_name.Text="";
boBox_press.Text="";
this.textBox_price.Text="";
this.textBox_total.Text="";
this.textBox_writer.Text="";
}
//判断书库中是否有该书,有,仅把数量加进去,没有,加进一条新的记录
else
{
if(con.State==ConnectionState.Closed)
con.Open();
Stringstr1="selectTotal_AmountfromBook_InfowhereBook_ID='"
+this.textBox_book_no.Text.Trim()+"'";
SqlCommandcom1=newSqlCommand(str1,con);
inttotal_num=Convert.ToInt32(com1.ExecuteScalar());
Stringstr2="selectNow_AmountfromBook_InfowhereBook_ID='"
+this.textBox_book_no.Text.Trim()+"'";
SqlCommandcom2=newSqlCommand(str2,con);
intnow_num=Convert.ToInt32(com2.ExecuteScalar());
intnum1=Convert.ToInt32(this.textBox_total.Text);
total_num+=num1;
now_num+=num1;
Stringstr="selectcount(*)fromBook_InfowhereBook_ID='"
+this.textBox_book_no.Text.Trim()+"'";
SqlCommandcom=newSqlCommand(str,con);
inti=Convert.ToInt32(com.ExecuteScalar());
if(i>0)
{
Stringstr3="updatedbo.Book_InfosetTotal_Amount='"+
total_num.ToString().Trim()+"',Now_Amount='"+now_num.ToString().Trim()
+"'whereBook_ID='"+this.textBox_book_no.Text.Trim()+"'";
da.UpdateCommand=newSqlCommand(str3,con);
res=da.UpdateCommand.ExecuteNonQuery();
if(res>0)
MessageBox.Show("新书入库成功!
","新书登记");
else
MessageBox.Show("新书入库失败!
","新书登记");
}
else
{
Stringbookid=this.textBox_book_no.Text.ToString().Trim();
Stringname=this.textBox_name.Text.ToString().Trim();
Stringwriter=this.textBox_writer.Text.ToString().Trim();
Stringpress=boBox_press.Text.ToString().Trim();
floatprice=(float)Convert.ToDouble(this.textBox_price.Text.ToString().Trim());
Stringdt=DateTime.Now.ToString();
inttotalaccount=Convert.ToInt32(total_num.ToString().Trim());
intnowacount=Convert.ToInt32(now_num.ToString().Trim());
Stringstr3="insertintodbo.Book_Info(Book_ID,Book_Name,Writer,Press,Price,"+
"InLibrary_Date,Total_Amount,Now_Amount)"+"values('"+bookid+"','"+name+"','"
+writer+"','"+press+"','"+price+"','"+dt+"','"+totalaccount+"','"+nowacount+"')";
da.InsertCommand=newSqlCommand(str3,con);
res=da.InsertCommand.ExecuteNonQuery();
if(res>0)
MessageBox.Show("新书入库成功!
","新书登记");
else
MessageBox.Show("新书入库失败!
","新书登记");
}
con.Close();
}
}
//主界面调用的每个模块的关闭按钮都是隐藏本体,以后不再写出关闭按钮的操作带代码
privatevoidForm3_FormClosing(objectsender,FormClosingEventArgse)
{
this.Visible=false;
}
privatevoidbutton_check_Click(objectsender,EventArgse)//查询
{
if(con.State==ConnectionState.Closed)
con.Open();
inti;
Stringstr1;
ds.Tables.Clear();
if(this.textBox_book_no.Text.Trim()==""&&this.textBox_name.Text.Trim()==""
&&boBox_press.Text.Trim()==""&&this.textBox_price.Text.Trim()==""
&&this.textBox_total.Text.Trim()==""&&this.textBox_writer.Text.Trim()=="")
{
MessageBox.Show("请填写任一项进行查询!
","新书入库登记");
}
else
{
if(this.textBox_book_no.Text!
="")//按书号查找
{
Stringstr="selectcount(*)fromdbo.Book_InfowhereBook_ID='"+
this.textBox_book_no.Text.ToString().Trim()+"'";
da.SelectCommand=newSqlCommand(str,con);
i=Convert.ToInt32(da.SelectCommand.ExecuteScalar());
if(i>0)
{
str1="select*fromdbo.Book_InfowhereBook_ID='"+
this.textBox_book_no.Text.ToString().Trim()+"'";
da.SelectCommand=newSqlCommand(str1,con);
da.Fill(ds,"selectifo2");
dataGridView_result.DataSource=ds.Tables["selectifo2"];
dataGridView_result.Refresh();
}
else
{
MessageBox.Show("不存在此记录!
");
}
}
elseif(this.textBox_name.Text!
="")//按书名查找
{
……//和上面类似
}
elseif(this.textBox_writer.Text!
="")//按作者查找
{
……//和上面类似
}
elseif(this.textBox_price.Text!
="")//按单价查找
{
……//和上面类似
}
elseif(boBox_press.Text!
="")//按出版社查找
{
……//和上面类似
}
elseif(this.textBox_total.Text!
="")//按总量查找
{
……//和上面类似
}
}
con.Close();
}
//更新的代码操作就是将控件内容置空,每个模块都是,所以以后的更新操作不再给出具体代码
privatevoidbutton_update_Click(objectsender,EventArgse)//更新
{
this.textBox_book_no.Text="";
this.textBox_name.Text="";
boBox_press.Text="";
this.textBox_price.Text="";
this.textBox_total.Text="";
this.textBox_writer.Text="";
}
privatevoiddataGridView_result_CellClick(objectsender,DataGridViewCellEventArgse)
{
inti=dataGridView_result.CurrentRow.Index;//dataGridView当前选中行
this.textBox_book_no.Text=ds.Tables["selectifo2"].Rows[i][0].ToString();
this.textBox_name.Text=ds.Tables["selectifo2"].Rows[i][1].ToString();
this.textBox_writer.Text=ds.Tables["selectifo2"].Rows[i][2].ToString();
this.textBox_price.Text=ds.Tables["selectifo2"].Rows[i][4].ToString();
boBox_press.Text=ds.Tables["selectifo2"].Rows[i][3].ToString();
}
}
●运行结果:
◆运行前数据库中Book_Info表中的数据:
图5
◆如果信息有没填的,点击“入库”会弹出如下对话框,图6:
图6图7图8图9
◆填入书号后点击“查询”在DataGridView控件里会显示按书号查询的结果,图7:
◆在DataGridView控件里点击一条记录会在上面的textBox和ComboBox控件里显示该书的信息,图8:
◆输入总量:
8,点击“入库”会在数据库中看到书号是787121030462的书籍的总量由20变到28本,现存量由20(图5)变到28本(图10)。
并弹出图9对话框:
图10图11
◆如果入库的书籍在数据库中没有的话,在Book_Info表中则增加一条新的记录:
图12图13图14
◆“刷新”按钮就是将textBox和ComboBox控件里的信息清空:
◆“查询”可以在textBox和ComboBox控件里填写任一项来查询,如果同时填有多项,则按前面的一项查询。
◆“返回”则返回到主界面窗口。
2)借书/还书:
●功能说明:
借书/还书管理是图书管理系统中的最重要的模块,包括