图书馆信息管理系统
目录
《软件综合应用开发》
1 设计题目
图书馆管理信息系统
2 设计目的
通过对图书管理信息系统的系统分析、系统设计、编码、调试等工作的实践,了解管理信息系统的一般设计和实现思路,从Windows或Web两个不同的切入点熟悉和掌握软件设计和实现的一般方法,深入了解SQL Server 2005 数据库设计的基本理论及方法。
该软件系统的编写要求我们具备C# 、SQL Server 、XML、ADO.net等多种程序设计工具和技术,并能熟练的加以中和应用。该实习采用复杂的真实案例来供我们进行练习,让我们从软件设计的最初的需求分析开始,全面地了解软件工程和程序设计的方法。本实习相对单门课程的实习更具有系统性、和综合性,能以软件工程的标准来规范我们的编程行为。实习过程中需要我们掌握多种开发和调试工具,能让我们灵活、熟练地应用所学的知识,为以后走向社会打下良好的基础。
3 开发环境介绍
3.1 .net开发环境
asp.net是一个已编译的基于 .net的Web应用程序开发环境,可以用任何与.net兼容的语言创作Web应用程序。另外,任何asp.net应用程序都可以使用整个.net Framework提供的技术,包括托管的公共语言运行库环境,类型安全,继承等。目前,asp.net已成为网站设计与开发的主流技术。
3.2 C#语言
C#语言是在C语言和C++语言基础上重新构造的,语法与C++和java语言都比较相似的,基于.net框架支持的一种完全面向对象的、类型安全的编程语言,也是.net的首选编程语言。
3.3 SQL Server数据
SQL语言的主要功能就是同各种数据库建立联系,进行沟通。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle, Sybase, Microsoft SQL Server, Access等都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select, Insert, Update, Delete, Create,以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。
SQL Server 是一个关系数据库管理系统。它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本。在Windows NT 推出后,Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了,Microsoft 将SQL Server 移植到Windows NT系统上,专注于开发推广SQL Server 的Windows NT 版本。Sybase 则较专注于SQL Server在UNIX 操作系统上的应用。
4 设计要求
4.1 应用背景
1. 图书馆有各种图书10万多册,每天结束/还书的流量1000人。
2. 图书信息包括:每种图书都有编码、书名、书号(ISBN)、一名或多名作者(译者)、出版社、定价和内容简介。
3. 读者信息包括:借书证记录有借阅者的姓名、所在单位、职业等。
4. 读者凭借书证借书,教师最多借书15本,借书期限最长为90天,学生最多借书8本,借书期限最长为30天。对于超期未还或超期欠费的读者只能还书不能借书或续借,每本书每超期一天罚款0.05元。
4.2 系统目标
1. 实现读者的借阅/归还/续借图示的功能,包括超期罚款。
2. 实现图书信息管理(书名、图书编号、书号、作者、出版社等)。
4. 实现信息浏览,管理员的查询功能和用户的查询功能,不同的身份查询的内容应当有所差异。
5. 读者的简单管理功能,读者查询、修改个人信息的功能。
6. 实现统计功能,按不同分类对图书馆书籍流动进行统计。
4.3 功能设计
4.3.1 图书管理部分
添加图书信息:图书管理员可以将新书添加到数据库中。
查询图书信息:所有用户可以按指定的组合条件查询图书,查询结果可以显示、预览、打印、导出到Excel 文件,对于图书管理员,可以删除图书和修改部分字段的内容。功能框架图如图。
|
图书管理部分 |
|
添加图书信息 |
|
查询图书信息 |
|
修改图书信息 |
|
删除图书信息 |
4.3.2 读者管理部分
图书管理员可以添加读者类别和修改读者类别。
图书管理员可以添加读者信息,可以按指定的组合条件查询读者,查询结果可以显示、预览、打印和导出到Excel 文件,还可以删除读者和修改部分字段和内容。功能框架图如图2.
|
读者管理部分 |
|
添加读者类别 |
|
修改读者类别 |
|
添加读者信息 |
|
查询读者信息 |
|
修改读者信息 |
|
删除读者信息 |
图2读者管理部分的结构图
4.3.3 借阅管理部分
借阅管理员可以给读者借书和还书,还书时如有图书超期,提示超期天数,并计算罚款,记录归还相关信息。
借阅管理员还可以按读者信息查询指定期间内的历史借阅信息和当前未还的信息,按图书信息查询指定期间内的历史借阅信息和当前借阅读者信息。查询结果可以显示、预览、打印和导出到Excel 文件,还可以删除读者和修改部分字段和内容。功能框架图如图3.
|
借阅管理部分 |
|
添加图书信息 |
|
添加还书信息 |
|
按读者查询借阅信息 |
|
按图书查询借阅信息 |
图3借阅管理部分的结构图
4.3.4 数据统计部分
按图书的个别属性进行分类统计(如:图书编号前几位、出版社、出版年、入管日期年、是否在馆等);按借阅的个别属性进行分类统计(如:读者类型、单位代码、借阅天数等);统计结果可以显示、预览、打印和导出到Excel 文件。框架图如图4.
|
统计数据 |
|
按图书统计 |
|
按借阅统计 |
图4数据管理部分结构图
4.3.5 系统管理部分
系统管理员和读者管理员可以预览、添加、修改和删除用户信息。框架图如图5.
|
系统管理部分 |
|
浏览用户信息 |
|
添加用户信息 |
|
修改用户信息 |
|
删除用户信息 |
图5系统管理部分结构图
4.3.6 读者部分
读者可以修改部分个人信息、密码和查询本人的借阅信息
|
读者 |
|
修改个人信息 |
|
修改密码 |
|
查询借阅信息 |
图6读者部分结构
5 总体设计
5.1 数据库的初步实现
数据库的实现、插入删除、表的创建各功能代码见附录。
5.2 程序流程的初步实现
5.2.1 登陆界面
5.2.2 主界面
5.2.3 添加图书
5.2.4 查询图书
5.2.5 添加读者
5.2.6 查询读者
查询新添加的读者
5.3 各功能对应代码
5.3.1 登陆界面
//单击登陆的事件
private void btnLogon_Click(object sender, EventArgs e)
{
//创建数据库的连接
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnStr"]);
//创建命令对象,设置查询语句为登陆存储过程"USP_UserLogon"
SqlCommand cmd = new SqlCommand("USP_UserLogon", conn);
//指定命令对象的过程为存储过程
cmd.CommandType=CommandType.StoredProcedure;
//添加存储过程的4个参数
cmd.Parameters.Add("@userid", SqlDbType.Char, 8);
cmd.Parameters.Add("@userpwd", SqlDbType.Char, 32);
cmd.Parameters.Add("@userrole", SqlDbType.NVarChar, 20);
cmd.Parameters.Add("@strerror", SqlDbType.NVarChar, 50);
//为参数赋值
cmd.Parameters["@userid"].Value = txtuserID.Text.Trim();
cmd.Parameters["@userpwd"].Value = txtuserPwd.Text.Trim();
//输出参数
cmd.Parameters["@userrole"].Direction = ParameterDirection.Output;
cmd.Parameters["@strerror"].Direction = ParameterDirection.Output;
try
{ //打开数据连接
conn.Open();
//执行命令
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
//捕捉过程中的错误
MessageBox.Show(ex.Message);
return;
}
finally
{
conn.Close();//关闭
}
//读取返回错误
string strerror = cmd.Parameters["@strerror"].Value.ToString();
if (strerror == "")//判断存储过程执行结果
{
//读取权限
string role = cmd.Parameters["@userrole"].Value.ToString();
librarymain frm = new librarymain();//创建主窗口
frm.Show();//显示主程序
frm.role = role;//传递权限
this.Hide();//隐藏登陆窗口
}
else
{
MessageBox.Show(strerror);//显示错误
}
}
5.3.2 主界面
private void tsbtnlendbook_Click(object sender, EventArgs e)
{
lendbook frm = new lendbook();//实例化
frm.MdiParent = this;//当前窗体为父窗体
frm.Show();//显示窗体
frm.WindowState = FormWindowState.Maximized;//窗体最大化
}
private void 借书ToolStripMenuItem_Click(object sender, EventArgs e)
{
lendbook frm = new lendbook();
frm.MdiParent = this;
frm.Show();
frm.WindowState = FormWindowState.Maximized;
}
private void treeView1_DoubleClick(object sender, EventArgs e)
{
if (treeView1.SelectedNode.Text == "借书")//判断控件名称为借书
借书ToolStripMenuItem_Click(null, null);
if(treeView1.SelectedNode.Text=="查询图书")
查询图书ToolStripMenuItem_Click(null, null);
}
private void 查询图书ToolStripMenuItem_Click(object sender, EventArgs e)
{
qrybook frm = new qrybook();
frm.MdiParent = this;
frm.Show();
frm.WindowState = FormWindowState.Maximized;
}
private void tsbtnqrybook_Click(object sender, EventArgs e)
{
qrybook frm = new qrybook();
frm.MdiParent = this;
frm.Show();
frm.WindowState = FormWindowState.Maximized;
}
private void tsbtnfine_Click(object sender, EventArgs e)
{
查询读者信息 frm = new 查询读者信息();
frm.MdiParent = this;
frm.Show();
frm.WindowState = FormWindowState.Maximized;
}
5.3.3 添加图书
private void button1_Click(object sender, EventArgs e)
{
//创建与数据库的连接
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnStr"]);
string sql = "insert into//编译SQL语句 Books(bkCode,bkName,bkISBN,bkClass,bkAuthor,bkPress,bkDatePress,bkPage,bkPrice,bkcover,bkDateIn,bkBrief)values('" + textBox1.Text.Trim () + "',N'" + textBox2.Text.Trim () + "','" + textBox3.Text.Trim () + "','" + textBox4.Text.Trim () + "',N'" + textBox8.Text.Trim () + "',N'" + textBox5.Text.Trim () + "','" + textBox6.Text.Trim () + "','" + textBox7.Text.Trim () + "','" + textBox9.Text.Trim () + "','"+ pictureBox1 .Image +"','" + textBox11.Text.Trim () + "',N'" + textBox12.Text.Trim () + "')";
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
finally
{
conn.Close();
}
}
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog myofd = new OpenFileDialog();
myofd.Filter = "图像文件(*.jpg)|*.jpg";
myofd.ShowDialog();
this.textBox10.Text = myofd.FileName;
this.pictureBox1.ImageLocation = this.textBox10.Text;
}
5.3.4 查询图书
private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnStr"]);
SqlCommand cmd = new SqlCommand("selectbk", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@bkbh", SqlDbType.Char, 10);
cmd.Parameters.Add("@bksh", SqlDbType.Char, 16);
cmd.Parameters.Add("@bkmc", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@bkzz", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@bkflh",SqlDbType.VarChar,20);
cmd.Parameters.Add("@strerror", SqlDbType.NVarChar, 50);
cmd.Parameters["@bkbh"].Value = bkcode.Text.Trim();
cmd.Parameters["@bksh"].Value = bkisbn.Text.Trim();
cmd.Parameters["@bkmc"].Value = bkname.Text.Trim();
cmd.Parameters["@bkzz"].Value = bkauthor.Text.Trim();
cmd.Parameters["@bkflh"].Value = bkclass.Text.Trim();
//错误为输出参数,但是没提示。
cmd.Parameters["@strerror"].Direction = ParameterDirection.Output;
DataTable table = new DataTable();//实例化
//创建适配器
SqlDataAdapter db = new SqlDataAdapter(cmd);
try
{
conn.Open();//打开数据连接
cmd.ExecuteNonQuery();//执行命令
db.Fill(table);
dataGridView1.DataSource = table;//显示表的控件
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
finally
{
conn.Close();
}
5.3.5 添加读者
private void button2_Click(object sender, EventArgs e)
{ //判断信息是否完整
if (rdID.Text.Trim() == "" || rdName.Text.Trim() == "" || rdType.Text.Trim() == "" || rdDept.Text.Trim() == "" || rdSex.Text.Trim() == "" || rdPwd.Text.Trim() == "")
{
baseclass.Message("提示:请完成信息的填写!", "警告");
}
else
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnStr"]);
string sql = "insert into//执行添加命令 Readers(rdID,rdName,rdType,rdDept,rdSex,rdPwd,rdDateReg)values ('" + rdID.Text + "',N'" + rdName.Text + "',N'" + rdType.Text + "',N'" + rdDept.Text + "',N'" + rdSex.Text + "','" + rdPwd.Text + "',getdate())";
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{ //捕捉错误
MessageBox.Show(ex.Message);
return;//没有错误返回
}
finally
{
conn.Close();
}
baseclass.Message("提示:添加成功!", "提示");
}
}
5.3.6 查询读者
private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnStr"]);
SqlCommand cmd = new SqlCommand("selectdz", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@rdid", SqlDbType.Char, 10);
cmd.Parameters.Add("@rdname", SqlDbType.NVarChar, 20);
cmd.Parameters.Add("@rdsex", SqlDbType.NVarChar, 4);
cmd.Parameters.Add("@rdtype", SqlDbType.NVarChar, 8);
cmd.Parameters.Add("@rddept", SqlDbType.NVarChar, 20);
cmd.Parameters.Add("@strerror", SqlDbType.NVarChar, 50);
cmd.Parameters["@rdid"].Value = rdid.Text.Trim();
cmd.Parameters["@rdname"].Value = rdname.Text.Trim();
cmd.Parameters["@rdsex"].Value = rdsex.Text.Trim();
cmd.Parameters["@rdtype"].Value = rdtype.Text.Trim();
cmd.Parameters["@rddept"].Value = rddept.Text.Trim();
cmd.Parameters["@strerror"].Direction = ParameterDirection.Output;
DataTable table = new DataTable();
SqlDataAdapter db = new SqlDataAdapter(cmd);
try
{
conn.Open();
cmd.ExecuteNonQuery();
db.Fill(table);
dataGridView1.DataSource = table;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
finally
{
conn.Close();
}
6 实验总结
这次的软件实训综合了以前的很多知识,该软件系统的编写要求我们具备C# 、SQL Server 、XML、ADO.net等多种程序设计工具和技术,并能熟练的加以中和应用。说实话,以前的我对SQL Server知之甚少,虽然这次的实训我没有全部完成,但是学到的东西却有很多。
本次实训最重要的就是建立于数据库的连接。我想,如果把这个搞通透了,这次的实训应该没有太多的难点。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,这些都是需要我继续巩固的。
这次课程设计终于顺利结束了,在设计中遇到了很多专业知识问题,最 后在 老师和同学的指导下,终于游逆而解。在此,感 谢于 老师的细心指导,也同样谢谢其他各组同学的无私帮助!
相信以后我会以更加积极地态度对待我的学习、对待我的生活。我的激情永远不会结束,相反,我会更加努力,努力的去弥补自己的缺点,发展自己的优点,去充实自己,只有在了解了自己的长短之后,我们会更加珍惜拥有的,更加努力的去完善它,增进它。只有不断的测试自己,挑战自己,才能拥有更多的成功和快乐!to us, happiness equals success! 快乐至上,享受过程,而不是结果!认真对待每一个实验,珍惜每一分一秒,学到最多的知识和方法,锻炼自己的能力,这个是我在这次的软件实训上学到的最重要的东西,也是以后都将受益匪浅的!
7 附录
7.1 数据库实现代码
--创建数据库Library
create database DBlibrary
on primary
(
name='Library',--数据库名称
FILENAME='E:\DBLibrary.mdf',
size=2048kb,--数据库大小
filegrowth=1024kb--数据库增长值
)
LOG ON
(
name='Library_log.ldf',
filename='E:\DBLibrary_log.ldf',
size=1024kB,
filegrowth=10%
)
go
use DBlibrary;
--创建图书信息表books
create table books
(
bkcode char(10) not null,
bkisbn char(16) not null,
bkname nvarchar(50) not null,
bkclass varchar(20) not null,
bklanguage smallint null,
bkauthor nvarchar(50) not null,
bkpress nvarchar(50) not null,
bkdatepress smalldatetime null,
bkpages int null,
bkprice numeric(10,2) not null,
bkdatein smalldatetime not null default getdate(),
bkcover image null,
bkbrief text null,
isexist bit null default 1,
primary key (bkcode)
)
go
--创建读者信息表readers
create table readers
(
rdid char(8) not null,
rdname nvarchar(20) not null,
rdpwd char(32) not null default'e10adc3949ba59abbe56e 057f 20f 883e',
rdsex nchar not null default'男',
rdtype nvarchar(8) not null,
rddept nvarchar(20) not null,
rddatereg smalldatetime not null,
isvalid bit not null default 0,
primary key(rdid)
)
go
--创建借阅信息表borrow
create table borrow
(
rdid char(8) not null,
bkcode char(10) not null,
continuetime smallint null default 0,
datelend smalldatetime null default getdate(),
datereturn smalldatetime null,
overdays int null default 0,
finemoney numeric(10,2) null default 0,
isreturn bit null default 0,
operatorlend nvarchar(20) null,
operatorret nvarchar(20) null,
--组合主键
primary key (rdid,bkcode),
--bkcode字段为books表中bkcode字段的外键
foreign key (bkcode) references books (bkcode),
--rdid字段为readers表中rdid字段的外键
foreign key (rdid) references readers(rdid)
)
go
--创建用户表
create table users
(
userid char(8) not null,
username nvarchar(20) not null,
userpwd char(32) not null,
userrole nvarchar(20) not null,
primary key (userid)
)
go
--创建读者类别表
create table readertype
(
typename nvarchar(10) not null,
canlendqty int not null,
canlendmonth int not null,
cancontinuetimes int not null,
finerate numeric(10,2) not null,
datevalid smallint not null,
primary key(typename)
)
go
--创建罚款缴纳表
create table capturefine
(
datereturn smalldatetime not null,
rdid char(8) not null,
bkcode char(10) not null,
bkname nvarchar(50) not null,
overdays int not null,
finemoney numeric(10,2) not null,
datecapture smalldatetime null,
opratoRFine nvarchar(20) null,
iscapture bit null default(0),
primary key(datereturn,rdid,bkcode)
)
go
--权限表
create table userpriv
(
userrole nvarchar(20) not null,
userpriv varchar(100) null,
primary key(userrole)
)
go
--读者登录存储过程
create procedure USP_Userlogon
@userid char(20),
@userpwd char(32),
@userrole nvarchar(20) out,
@strerror nvarchar(50) out
AS
--在表users内查找userid和userpwd是否和输入的相匹配
select @userrole from users where userid=@userid and userpwd=@userpwd
if @@rowcount<>0 begin--如果这一行不为0
set @strerror=''输出结果
return--返回
end
--在表readers内查找userid和userpwd是否和输入的相匹配
select*from readers where rdid =@userid and rdpwd=@userpwd
if @@rowcount<>0 begin
set @strerror=''
end
else begin-- 如果不一样
set @strerror=N'用户名和密码不匹配,登录失败!'--输出结果
end
go
--drop proc USP_Userlogon 删除USP_Userlogon的存储过程
--查询图书存储过程
create procedure selectbk
@bkbh char(8),
@bksh char(16),
@bkmc nvarchar(50),
@bkzz nvarchar(50),
@bkflh varchar(20),
@strerror nvarchar(50) out
As
--在表books内查找这些数据并显示引号内的名称
select bkcode'图书编号',bkisbn'书号',bkname'书名',bkauthor'作者',bkpress'出版社',bkdatepress'出版日期',
bkpages'页数',bkprice'价格',isexist'是否在管'from books
where (bkcode=@bkbh or bkisbn=@bksh or bkclass=@bkflh)and(@bkmc like'%' or @bkzz like'%')
--如果没有输入这些参数
if(@bkbh is null or @bksh is null or @bkflh is null)
begin set @strerror=N'请您输入图书编号,图书书号或者分类号'
return
end
go
--drop proc selectbk
--查询读者信息存储过程
create procedure selectdz
@rdid char(8),
@rdname nvarchar(20),
@rdsex nvarchar(4),
@rdtype nvarchar(8),
@rddept nvarchar(20),
@strerror nvarchar(50) out
as
select rdid'读者证号',rdname'读者姓名',rdsex'性别',rdtype'读者类别',rddept'读者单位',
rddatereg'读者登记日期',isvalid'是否过期'from readers
where(rdid=@rdid or rdname=@rdname or rdsex=@rdsex or rdtype=@rdtype or rddept=@rddept)
if(@rdid is null or @rdname is null)
begin set @strerror=N'请您输入学号或姓名'
end
go
CREATE PROCEDURE USP_UserMng2
(
@UserID char(8),
@sResult nvarchar(50) out
)
as
begin
select UserID as 用户号,UserName as 用户名,UserRole as 角色
from dbo.Users where UserID=@UserID
if @@Rowcount = 0 begin
set @sResult = N'没有满足此用户的记录'
return
end
delete from dbo.Users where UserID=@UserID
set @sResult = N'删除成功!'
end
go
| 感动 | 同情 | 无聊 | 愤怒 | 搞笑 | 难过 | 高兴 | 路过 |
相关文章
-
没有相关内容

会员登录