图书管理系统课程设计报告
1. 设计目的
随着计算机技术的不断发展,计算机作为知识经济时代的产物,已被广泛应用于社会各个行业和领域。目前,我国的科技水平高速发展,计算机作为今天使用最广的现代化工具已深入到各个领域,并且正在成为未来社会——信息社会的重要支柱。在这样的大背景下,现代图书馆的管理方式,资源建设等方面都发生了重大变化,这种变化表现在图书馆工作,管理和服务平台发生的变化,图书馆不再是传统的手工操作,人工管理,而是全面实行计算机管理。
图书馆的正常运营中总是面对大量的读者信息,图书信息以及两者相互作用产生的借书信息,因此要对读者资源,图书资源,借书信息进行管理。本系统的开发就是在于提高图书管理的工作效率,加强图书馆的管理,全面实行计算机管理。
2. 可行性研究报告
在软件的开发过程中,这一步是十分必要的。如果在定义阶段及早发现将来可能在开发过程中的问题,及早做出决断,可以避免大量的人力,财力和时间上的浪费。
1.
技术可行性:本组开发成员都具有一定的电脑知识,学习过多种程
序开发语言。特别是在项目确定后对C#和SQL Server 数据库的强化学习,使本系统成功开发成为可能。 2.
经济可行性:本系统有其生存空间,成功后有其市场。并且本小组
开发人员基于一种爱好去研究他的,我们有自己的电脑,可以说成本开支极其有限。 3.
现阶段各种各样的图书馆越来越多,图书馆的书也越来越多,图书
的管理工作也越来越复杂。本系统就是为了减轻图书管理人员的工作而设计的。 4.
法律可行性:本系统为我五人开发小组独立完成,不关他人,开发
成功后其所有权归我们五人所有,用户购买后其使用权一同买断,我们将
提供技术支持。 5.
基于水平和时间有限,我们的系统还不是十分完善。可扩展的地方
很多,现列举如:
建立图书预约机制 建立读者反馈机制 建立过期催还机制 建立条码扫描机制等。 以现有的人力和时间来衡量,我们只有放弃。
经过以上可行性论证,本系统可以按任务书要求开发。 3. 项目开发计划书
4. 系统需求规格说明书
该过程是个不断认识不断细化的过程。这里所要完成的工作是深入描述软件的功能和性能,确定软件的设计限制和软件同其他系统元素的接口细节,从而奠定软件的开发基础。
1.性能需求:该系统中,各个模块只有管理人员才能对其进行操作,系统管理人员要进行身分验证才能进入界面操作。
2.功能需求:我们设计的系统要完成的功能模块如下:
登陆模块 管理员管理模块 借阅卡管理模块 书籍管理模块 查询管理模块。
3.环境需求:电脑需要安装.net 框架3.5,安装SQL Server 2008数据库,硬件要求酷睿i3双核以上处理器,100G 硬盘空间,1G 以上内存,系统应有Windows XP,Windows7,或Windows8操作系统。
4.界面需求:本软件是面向大众,界面友好,操作简单灵活,根据界面上的提示便可完成一系列动作。
5. 概要设计说明书
5.1 系统设计流程
(一)
建库;
建立数据库; (二)
设计相应的操作界面;
5.2 功能模块结构图设计
一、软件设计过程
对程序结构、数据结构、过程细节和接口细节逐步细化、评审和编写文档的过程。从技术角度上,软件设计分成体系结构设计、数据设计、过程设计、接口设计4个方面的工作。从管理角度上讲,软件设计分为概要设计和详细设计两个阶段。
二、软件设计目标
设计必须实现分析模型中描述的所有显示需求,必须满足用户希望的所有隐式需求;设计必须是可读、可理解的,使得将来易于编程、易于测试、易于维护;设计应从实现角度出发,给出数据、功能、行为相关的软件全貌。 三、基本原理和相关概念
⑴抽象化:常用的抽象化手段有过程抽象、数据抽象和控制抽象 ● 过程抽象:任何一个完成明确动能的操作都可被使用者当做单位的实体看待,尽管这个操作时机上可能由一系列更低级的操作来完成。
● 数据抽象:与过程抽象一样,允许设计人员在不同层次上描述数据对象的细节。
● 与过程抽象和数据抽象一样,控制抽象可以包含一个程序控制机制而无须规定其内部细节。
⑵自顶向下,逐步细化:将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,知道用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。
⑶模块化:将一个待开发的软件分解成若干个小的简单的部分——模块,每个模块可独立地开发、测试,最后组装成完整的程序。这是一种复杂问题的“分而治之”的原则。模块化的目的是使程序结构清晰,容易阅读,容易理解,容易测试,容易修改。
⑷控制层次:表明了程序构件(模块)的组织情况。控制层次往往用程序的层次结构(树形或网型)来表示。
● 深度:程序结构的层次数,可以反映程序机构的规模和复杂程度。 ● 宽度:同一层模块的最大模块个数
● 模块的扇出:一个模块调用(或控制)的其他模块数 ● 模块的扇入:调用(或控制)一个给定模块的模块个数
⑸信息屏蔽:将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少的显露其内部的处理,可以提高软件的可修改性,可测试性和可移植性。
⑹模块独立:每个模块完成一个相对特定独立的子功能,并且与其他模块之间的联系简单。衡量度量标准有两个:模块间的耦合和模块的内聚。模块独立性强必须做到高内聚低耦合。
● 耦合:模块之间联系的紧密程度,耦合度越高模块的独立性越差。耦合度从低到高的次序为:非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合、内容耦合。
● 内聚是指内部各元素之间联系的紧密程度,内聚度越低模块的独立性越差。内聚度从低到高依次是:偶然内聚、逻辑内聚、瞬时内聚、过程内聚、通信内聚、顺序内聚、功能内聚。
结构化设计方法,采用类似于结构化分析的“由大到小”、“自顶向下,逐层分解”的基本思想描述(分解)系统。结构化设计方法,首先以数据流图为基础导出系统模块(功能)结构图。在导出系统模块(功能)结构图的过程中,以独立性、低耦合性、高内聚性、公共模块作为模块划分的原则。先将系统数据流图中的加工转换成模块,再将各大模块继续划分为较小的模块,直到每一模块都是功能单一的模块。
根据系统功能分析和图书馆管理的特点,经过模块化的分析得到如图所示的
图书馆管理系统功能模块结构图。
5.3 E-R图
管理员E-R 图
学生E-R 图
图书E-R 图
借阅E-R 图
系统整体E-R 图
6. 详细设计说明书 6.1 数据库设计
根据设计好的各实体E-R 图创建数据库的逻辑结构,本系统采用了送了SQL Server 2008数据库,数据库名称为BookMgr .数据库BookMgr 包含以下6个表:图书信息表book 、图书管理员表admin 、图书类别表type 、借书卡信息表card 、图书借阅表lend 。
表的具体结构如下:
1)管理员表:用于保存管理员信息,结构如下
/****** Object: Table [dbo].[Users] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Users]( [Name] [nvarchar](50) NULL, [Password] [nvarchar](50) NULL, [Type] [int] NULL ) ON [PRIMARY] GO
2)图书信息表
/****** Object: Table [dbo].[Book] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Book](
[Num] [nvarchar](50) NOT NULL, [Name] [nvarchar](50) NULL, [Author] [nvarchar](50) NULL, [Type] [int] NULL,
[ISBN] [nvarchar](50) NULL, [CBS] [nvarchar](50) NULL, [CBRQ] [datetime] NULL,
[Status] [nvarchar](50) NULL,
CONSTRAINT [PK_Book] PRIMARY KEY CLUSTERED (
[Num] ASC
) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] ) ON [PRIMARY]
GO
3)借书卡信息表
/****** Object: Table [dbo].[Card] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Card](
[Num] [nvarchar](50) NOT NULL, [Name] [nvarchar](50) NULL, [Class] [nvarchar](50) NULL, [StartTime] [datetime] NULL, [EndTime] [datetime] NULL,
CONSTRAINT [PK_Card] PRIMARY KEY CLUSTERED (
[Num] ASC
) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] ) ON [PRIMARY] GO
4)图书借阅表
/****** Object: Table [dbo].[Lend] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Lend](
[CardNum] [nvarchar](50) NULL, [BookNum] [nvarchar](50) NULL, [Time] [datetime] NULL,
[Status] [nvarchar](50) NULL ) ON [PRIMARY] GO
5)图书类型表
/****** Object: Table [dbo].[Type] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Type](
[ID] [int] IDENTITY (1, 1) NOT NULL, [Name] [nvarchar](50) NULL,
CONSTRAINT [PK_Type] PRIMARY KEY CLUSTERED (
[ID] ASC
) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] ) ON [PRIMARY] GO
6.2 系统界面设计 登陆界面
// 验证用户
private void okButton_Click(object sender, System.EventArgs e) { }
if (tB_Name.Text == "" ) { }
if (cB_Type.SelectedIndex
string strCommand;
strCommand = "select Password from Users where Name = '" + tB_Name.Text + "'" ; SqlDataReader reader;
reader = command.ExecuteReader(); if (reader.Read()) { } else
MessageBox .Show(" 用户不存在!" , " 提示" ); reader.Close();
string password = reader["Password" ].ToString(); // 验证用户
if (password == tB_Password.Text) { } else { }
MessageBox .Show(" 用户或口令信息不正确!" , " 提示" ); this .DialogResult = DialogResult .OK; this .Close();
MessageBox .Show(" 请选择登陆身份!" , " 提示" ); return ;
MessageBox .Show(" 请输入用户名!" , " 提示" ); return ;
SqlCommand command = new SqlCommand (strCommand, DBHelper .Conn);
//MainForm.m_strName = tB_Name.Text;
主界面
private void 图书管理ToolStripMenuItem_Click(object sender, EventArgs e) {
Book dlg = new Book (); dlg.MdiParent = this ; dlg.Show(); }
private void 借书卡管理ToolStripMenuItem_Click(object sender, EventArgs e) {
Card dlg = new Card (); dlg.MdiParent = this ; dlg.Show(); }
图书管理
private void Book_Load(object sender, EventArgs e) {
string sql = string .Format(@"select [Num] 编号,Book.[Name] 书名,[Author] 作者 ,Type.Name 类别,[ISBN],[CBS] 出版社,[CBRQ] 出版日期,[Status] 出借状态 from Book left join Type on Book.Type=Type.ID");
dataGridView1.DataSource = DBHelper .GetDataSet(sql); }
private void btnAdd_Click(object sender, EventArgs e) {
BookAdd dlg = new BookAdd ("" ); dlg.ShowDialog();
string sql = string .Format(@"select [Num] 编号,Book.[Name] 书名,[Author] 作者 ,Type.Name 类别,[ISBN],[CBS] 出版社,[CBRQ] 出版日期,[Status] 出借状态 from Book left join Type on Book.Type=Type.ID");
dataGridView1.DataSource = DBHelper .GetDataSet(sql); }
借书卡管理
private void Card_Load(object sender, EventArgs e) {
dataGridView1.DataSource = DBHelper .GetDataSet(@"select [Num] 编号
,[Name] 姓名,[Class] 班级,[StartTime] 开始时间,[EndTime] 结束时间 FROM [Card]"); }
private void button1_Click(object sender, EventArgs e) {
CardAdd dlg = new CardAdd ("" ); dlg.ShowDialog();
dataGridView1.DataSource = DBHelper .GetDataSet(@"select [Num] 编号
,[Name] 姓名,[Class] 班级,[StartTime] 开始时间,[EndTime] 结束时间 FROM [Card]"); }
借书界面
private void Lend_Load(object sender, EventArgs e) {
CardNum.DataSource = DBHelper .GetDataSet("select * from Card"); CardNum.DisplayMember = "Num" ; CardNum.ValueMember = "Name" ; CardName.Text = "" ;
BookNum.DataSource = DBHelper .GetDataSet("select * from Book"); BookNum.DisplayMember = "Num" ; BookNum.ValueMember = "Name" ; BookName.Text = "" ; }
private void button1_Click(object sender, EventArgs e) {
string sql = string .Format("insert into lend values('{0}', '{1}', '{2}', '在借')" , CardNum.Text, BookNum.Text, DateTime .Now); DBHelper .GetCommand(sql);
sql = string .Format("update Book set Status='已借出' where Num='{0}'", BookNum.Text);
DBHelper .GetCommand(sql); MessageBox .Show(" 借阅成功!" ); this .Close(); }
还书界面
private void Back_Load(object sender, EventArgs e) {
CardNum.DataSource = DBHelper .GetDataSet("select * from Card"); CardNum.DisplayMember = "Num" ; CardNum.ValueMember = "Name" ; CardName.Text = "" ; }
private void button1_Click(object sender, EventArgs e) {
string sql = string .Format("update Lend set Status='归还' where BookNum='{0}' and CardNum='{1}'",
BookNum.Text, CardNum.Text); DBHelper .GetCommand(sql);
sql = string .Format("update Book set Status='未借出' where Num='{0}'", BookNum.Text);
DBHelper .GetCommand(sql); MessageBox .Show(" 归还成功!" ); this .Close(); }
图书查询界面
private void button1_Click(object sender, EventArgs e) {
string sql = string .Format(@"select [Num] 编号,[Name] 书名,[Author] 作者 ,[Type] 类别,[ISBN],[CBS] 出版社,[CBRQ] 出版日期,[Status] 出借状态 from Book
where Num like '%{0}%' or Name like '%{0}%' or Author like '%{0}%' or ISBN like '%{0}%' or CBS like '%{0}%'", textBox1.Text);
dataGridView1.DataSource = DBHelper .GetDataSet(sql); }
超期未还图书界面
private void BackTimeout_Load(object sender, EventArgs e) {
string sql = string .Format(@"select C.Num 借书卡号, C.Name 姓名,
C.Class 班级, B.Num 书号, B.Name 书名, L.Time 借阅时间 from Lend L left join Book B on
L.BookNum=B.Num
left join Card C on L.CardNum=C.Num where L.Status='在借' and L.Time
dataGridView1.DataSource = DBHelper .GetDataSet(sql); }
用户管理界面
}
// 添加用户
private void button_Add_Click(object sender, System.EventArgs e) {
string strCommand = string .Format("INSERT INTO Users(Name, Password, Type) VALUES try {
m_dsUser.Clear();
tB_Name.Text, tB_Password.Text, cB_Type.SelectedIndex); m_dsUser = new DataSet ();
m_adapterUser.Fill(m_dsUser, "users" ); dG_User.DataSource = m_dsUser; dG_User.DataMember = "users" ;
m_adapterUser = new SqlDataAdapter (strSql, DBHelper .Conn);
// 初始化
private void Form_ManagUser_Load(object sender, System.EventArgs e) {
string strSql = "select Name, Password from Users";
('{0}', '{1}', {2})",
SqlCommand command = new SqlCommand (strCommand, DBHelper .Conn);
}
}
command.ExecuteNonQuery();
m_adapterUser.Fill(m_dsUser, "Users" );
catch (System.Data.SqlClient.SqlException ex) { }
MessageBox .Show(ex.Message);
7. 测试计划
一个完整的软件项目必须要有测试这一环节,在开发的过程中,是将整个项目分成若干个小的部分来完成的,由项目小组的不通成员承担不同的任务,虽然在项目之初已经统一好了各个部分的接口,但由于前期实地调研对用户需求的分析并不能很好的与设计项目的具体要求吻合起来,这就难免会造成设计出的软件或是达不到用户的要求,或是有一些功能是多余等等诸多不适应用户或是不适应软件正常运行的因素。那么这些不同的问题必须在项目设计完成后期的测试阶段找出来,通过测试得到不通用户给于的各种反馈信息,进一步完善不足之处,对多余的功能进行删减,不够完整的功能进行完善,尽可能的在不影响全体程序的情况下实现更人性化更完整的软件。
测试进度安排表
8. 设计心得体会
这次图书馆管理系统的设计真是让我绞尽脑汁,经过了两周才做好。其实制
作管理系统我们现在看来已经不是难事,难的是如何去构思,如何去想。
做系统要用心去做,我从中也学到很多知识,知道如何去综合多门学科中的知识,编程能力也有了很大提高,另外也有很多心得体会。
本系统是一个最基本的图书馆管理系统,可扩展性很大,系统的执行效率也比较高。
这些天的设计,我深刻体会到软件开发是相当辛苦的,但成功以后的喜悦也是非常美妙的,投入的越多,获得的快乐与充实感越多。
图书管理系统课程设计报告
1. 设计目的
随着计算机技术的不断发展,计算机作为知识经济时代的产物,已被广泛应用于社会各个行业和领域。目前,我国的科技水平高速发展,计算机作为今天使用最广的现代化工具已深入到各个领域,并且正在成为未来社会——信息社会的重要支柱。在这样的大背景下,现代图书馆的管理方式,资源建设等方面都发生了重大变化,这种变化表现在图书馆工作,管理和服务平台发生的变化,图书馆不再是传统的手工操作,人工管理,而是全面实行计算机管理。
图书馆的正常运营中总是面对大量的读者信息,图书信息以及两者相互作用产生的借书信息,因此要对读者资源,图书资源,借书信息进行管理。本系统的开发就是在于提高图书管理的工作效率,加强图书馆的管理,全面实行计算机管理。
2. 可行性研究报告
在软件的开发过程中,这一步是十分必要的。如果在定义阶段及早发现将来可能在开发过程中的问题,及早做出决断,可以避免大量的人力,财力和时间上的浪费。
1.
技术可行性:本组开发成员都具有一定的电脑知识,学习过多种程
序开发语言。特别是在项目确定后对C#和SQL Server 数据库的强化学习,使本系统成功开发成为可能。 2.
经济可行性:本系统有其生存空间,成功后有其市场。并且本小组
开发人员基于一种爱好去研究他的,我们有自己的电脑,可以说成本开支极其有限。 3.
现阶段各种各样的图书馆越来越多,图书馆的书也越来越多,图书
的管理工作也越来越复杂。本系统就是为了减轻图书管理人员的工作而设计的。 4.
法律可行性:本系统为我五人开发小组独立完成,不关他人,开发
成功后其所有权归我们五人所有,用户购买后其使用权一同买断,我们将
提供技术支持。 5.
基于水平和时间有限,我们的系统还不是十分完善。可扩展的地方
很多,现列举如:
建立图书预约机制 建立读者反馈机制 建立过期催还机制 建立条码扫描机制等。 以现有的人力和时间来衡量,我们只有放弃。
经过以上可行性论证,本系统可以按任务书要求开发。 3. 项目开发计划书
4. 系统需求规格说明书
该过程是个不断认识不断细化的过程。这里所要完成的工作是深入描述软件的功能和性能,确定软件的设计限制和软件同其他系统元素的接口细节,从而奠定软件的开发基础。
1.性能需求:该系统中,各个模块只有管理人员才能对其进行操作,系统管理人员要进行身分验证才能进入界面操作。
2.功能需求:我们设计的系统要完成的功能模块如下:
登陆模块 管理员管理模块 借阅卡管理模块 书籍管理模块 查询管理模块。
3.环境需求:电脑需要安装.net 框架3.5,安装SQL Server 2008数据库,硬件要求酷睿i3双核以上处理器,100G 硬盘空间,1G 以上内存,系统应有Windows XP,Windows7,或Windows8操作系统。
4.界面需求:本软件是面向大众,界面友好,操作简单灵活,根据界面上的提示便可完成一系列动作。
5. 概要设计说明书
5.1 系统设计流程
(一)
建库;
建立数据库; (二)
设计相应的操作界面;
5.2 功能模块结构图设计
一、软件设计过程
对程序结构、数据结构、过程细节和接口细节逐步细化、评审和编写文档的过程。从技术角度上,软件设计分成体系结构设计、数据设计、过程设计、接口设计4个方面的工作。从管理角度上讲,软件设计分为概要设计和详细设计两个阶段。
二、软件设计目标
设计必须实现分析模型中描述的所有显示需求,必须满足用户希望的所有隐式需求;设计必须是可读、可理解的,使得将来易于编程、易于测试、易于维护;设计应从实现角度出发,给出数据、功能、行为相关的软件全貌。 三、基本原理和相关概念
⑴抽象化:常用的抽象化手段有过程抽象、数据抽象和控制抽象 ● 过程抽象:任何一个完成明确动能的操作都可被使用者当做单位的实体看待,尽管这个操作时机上可能由一系列更低级的操作来完成。
● 数据抽象:与过程抽象一样,允许设计人员在不同层次上描述数据对象的细节。
● 与过程抽象和数据抽象一样,控制抽象可以包含一个程序控制机制而无须规定其内部细节。
⑵自顶向下,逐步细化:将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,知道用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。
⑶模块化:将一个待开发的软件分解成若干个小的简单的部分——模块,每个模块可独立地开发、测试,最后组装成完整的程序。这是一种复杂问题的“分而治之”的原则。模块化的目的是使程序结构清晰,容易阅读,容易理解,容易测试,容易修改。
⑷控制层次:表明了程序构件(模块)的组织情况。控制层次往往用程序的层次结构(树形或网型)来表示。
● 深度:程序结构的层次数,可以反映程序机构的规模和复杂程度。 ● 宽度:同一层模块的最大模块个数
● 模块的扇出:一个模块调用(或控制)的其他模块数 ● 模块的扇入:调用(或控制)一个给定模块的模块个数
⑸信息屏蔽:将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少的显露其内部的处理,可以提高软件的可修改性,可测试性和可移植性。
⑹模块独立:每个模块完成一个相对特定独立的子功能,并且与其他模块之间的联系简单。衡量度量标准有两个:模块间的耦合和模块的内聚。模块独立性强必须做到高内聚低耦合。
● 耦合:模块之间联系的紧密程度,耦合度越高模块的独立性越差。耦合度从低到高的次序为:非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合、内容耦合。
● 内聚是指内部各元素之间联系的紧密程度,内聚度越低模块的独立性越差。内聚度从低到高依次是:偶然内聚、逻辑内聚、瞬时内聚、过程内聚、通信内聚、顺序内聚、功能内聚。
结构化设计方法,采用类似于结构化分析的“由大到小”、“自顶向下,逐层分解”的基本思想描述(分解)系统。结构化设计方法,首先以数据流图为基础导出系统模块(功能)结构图。在导出系统模块(功能)结构图的过程中,以独立性、低耦合性、高内聚性、公共模块作为模块划分的原则。先将系统数据流图中的加工转换成模块,再将各大模块继续划分为较小的模块,直到每一模块都是功能单一的模块。
根据系统功能分析和图书馆管理的特点,经过模块化的分析得到如图所示的
图书馆管理系统功能模块结构图。
5.3 E-R图
管理员E-R 图
学生E-R 图
图书E-R 图
借阅E-R 图
系统整体E-R 图
6. 详细设计说明书 6.1 数据库设计
根据设计好的各实体E-R 图创建数据库的逻辑结构,本系统采用了送了SQL Server 2008数据库,数据库名称为BookMgr .数据库BookMgr 包含以下6个表:图书信息表book 、图书管理员表admin 、图书类别表type 、借书卡信息表card 、图书借阅表lend 。
表的具体结构如下:
1)管理员表:用于保存管理员信息,结构如下
/****** Object: Table [dbo].[Users] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Users]( [Name] [nvarchar](50) NULL, [Password] [nvarchar](50) NULL, [Type] [int] NULL ) ON [PRIMARY] GO
2)图书信息表
/****** Object: Table [dbo].[Book] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Book](
[Num] [nvarchar](50) NOT NULL, [Name] [nvarchar](50) NULL, [Author] [nvarchar](50) NULL, [Type] [int] NULL,
[ISBN] [nvarchar](50) NULL, [CBS] [nvarchar](50) NULL, [CBRQ] [datetime] NULL,
[Status] [nvarchar](50) NULL,
CONSTRAINT [PK_Book] PRIMARY KEY CLUSTERED (
[Num] ASC
) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] ) ON [PRIMARY]
GO
3)借书卡信息表
/****** Object: Table [dbo].[Card] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Card](
[Num] [nvarchar](50) NOT NULL, [Name] [nvarchar](50) NULL, [Class] [nvarchar](50) NULL, [StartTime] [datetime] NULL, [EndTime] [datetime] NULL,
CONSTRAINT [PK_Card] PRIMARY KEY CLUSTERED (
[Num] ASC
) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] ) ON [PRIMARY] GO
4)图书借阅表
/****** Object: Table [dbo].[Lend] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Lend](
[CardNum] [nvarchar](50) NULL, [BookNum] [nvarchar](50) NULL, [Time] [datetime] NULL,
[Status] [nvarchar](50) NULL ) ON [PRIMARY] GO
5)图书类型表
/****** Object: Table [dbo].[Type] Script Date: 04/26/2015 15:56:26 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE TABLE [dbo]. [Type](
[ID] [int] IDENTITY (1, 1) NOT NULL, [Name] [nvarchar](50) NULL,
CONSTRAINT [PK_Type] PRIMARY KEY CLUSTERED (
[ID] ASC
) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] ) ON [PRIMARY] GO
6.2 系统界面设计 登陆界面
// 验证用户
private void okButton_Click(object sender, System.EventArgs e) { }
if (tB_Name.Text == "" ) { }
if (cB_Type.SelectedIndex
string strCommand;
strCommand = "select Password from Users where Name = '" + tB_Name.Text + "'" ; SqlDataReader reader;
reader = command.ExecuteReader(); if (reader.Read()) { } else
MessageBox .Show(" 用户不存在!" , " 提示" ); reader.Close();
string password = reader["Password" ].ToString(); // 验证用户
if (password == tB_Password.Text) { } else { }
MessageBox .Show(" 用户或口令信息不正确!" , " 提示" ); this .DialogResult = DialogResult .OK; this .Close();
MessageBox .Show(" 请选择登陆身份!" , " 提示" ); return ;
MessageBox .Show(" 请输入用户名!" , " 提示" ); return ;
SqlCommand command = new SqlCommand (strCommand, DBHelper .Conn);
//MainForm.m_strName = tB_Name.Text;
主界面
private void 图书管理ToolStripMenuItem_Click(object sender, EventArgs e) {
Book dlg = new Book (); dlg.MdiParent = this ; dlg.Show(); }
private void 借书卡管理ToolStripMenuItem_Click(object sender, EventArgs e) {
Card dlg = new Card (); dlg.MdiParent = this ; dlg.Show(); }
图书管理
private void Book_Load(object sender, EventArgs e) {
string sql = string .Format(@"select [Num] 编号,Book.[Name] 书名,[Author] 作者 ,Type.Name 类别,[ISBN],[CBS] 出版社,[CBRQ] 出版日期,[Status] 出借状态 from Book left join Type on Book.Type=Type.ID");
dataGridView1.DataSource = DBHelper .GetDataSet(sql); }
private void btnAdd_Click(object sender, EventArgs e) {
BookAdd dlg = new BookAdd ("" ); dlg.ShowDialog();
string sql = string .Format(@"select [Num] 编号,Book.[Name] 书名,[Author] 作者 ,Type.Name 类别,[ISBN],[CBS] 出版社,[CBRQ] 出版日期,[Status] 出借状态 from Book left join Type on Book.Type=Type.ID");
dataGridView1.DataSource = DBHelper .GetDataSet(sql); }
借书卡管理
private void Card_Load(object sender, EventArgs e) {
dataGridView1.DataSource = DBHelper .GetDataSet(@"select [Num] 编号
,[Name] 姓名,[Class] 班级,[StartTime] 开始时间,[EndTime] 结束时间 FROM [Card]"); }
private void button1_Click(object sender, EventArgs e) {
CardAdd dlg = new CardAdd ("" ); dlg.ShowDialog();
dataGridView1.DataSource = DBHelper .GetDataSet(@"select [Num] 编号
,[Name] 姓名,[Class] 班级,[StartTime] 开始时间,[EndTime] 结束时间 FROM [Card]"); }
借书界面
private void Lend_Load(object sender, EventArgs e) {
CardNum.DataSource = DBHelper .GetDataSet("select * from Card"); CardNum.DisplayMember = "Num" ; CardNum.ValueMember = "Name" ; CardName.Text = "" ;
BookNum.DataSource = DBHelper .GetDataSet("select * from Book"); BookNum.DisplayMember = "Num" ; BookNum.ValueMember = "Name" ; BookName.Text = "" ; }
private void button1_Click(object sender, EventArgs e) {
string sql = string .Format("insert into lend values('{0}', '{1}', '{2}', '在借')" , CardNum.Text, BookNum.Text, DateTime .Now); DBHelper .GetCommand(sql);
sql = string .Format("update Book set Status='已借出' where Num='{0}'", BookNum.Text);
DBHelper .GetCommand(sql); MessageBox .Show(" 借阅成功!" ); this .Close(); }
还书界面
private void Back_Load(object sender, EventArgs e) {
CardNum.DataSource = DBHelper .GetDataSet("select * from Card"); CardNum.DisplayMember = "Num" ; CardNum.ValueMember = "Name" ; CardName.Text = "" ; }
private void button1_Click(object sender, EventArgs e) {
string sql = string .Format("update Lend set Status='归还' where BookNum='{0}' and CardNum='{1}'",
BookNum.Text, CardNum.Text); DBHelper .GetCommand(sql);
sql = string .Format("update Book set Status='未借出' where Num='{0}'", BookNum.Text);
DBHelper .GetCommand(sql); MessageBox .Show(" 归还成功!" ); this .Close(); }
图书查询界面
private void button1_Click(object sender, EventArgs e) {
string sql = string .Format(@"select [Num] 编号,[Name] 书名,[Author] 作者 ,[Type] 类别,[ISBN],[CBS] 出版社,[CBRQ] 出版日期,[Status] 出借状态 from Book
where Num like '%{0}%' or Name like '%{0}%' or Author like '%{0}%' or ISBN like '%{0}%' or CBS like '%{0}%'", textBox1.Text);
dataGridView1.DataSource = DBHelper .GetDataSet(sql); }
超期未还图书界面
private void BackTimeout_Load(object sender, EventArgs e) {
string sql = string .Format(@"select C.Num 借书卡号, C.Name 姓名,
C.Class 班级, B.Num 书号, B.Name 书名, L.Time 借阅时间 from Lend L left join Book B on
L.BookNum=B.Num
left join Card C on L.CardNum=C.Num where L.Status='在借' and L.Time
dataGridView1.DataSource = DBHelper .GetDataSet(sql); }
用户管理界面
}
// 添加用户
private void button_Add_Click(object sender, System.EventArgs e) {
string strCommand = string .Format("INSERT INTO Users(Name, Password, Type) VALUES try {
m_dsUser.Clear();
tB_Name.Text, tB_Password.Text, cB_Type.SelectedIndex); m_dsUser = new DataSet ();
m_adapterUser.Fill(m_dsUser, "users" ); dG_User.DataSource = m_dsUser; dG_User.DataMember = "users" ;
m_adapterUser = new SqlDataAdapter (strSql, DBHelper .Conn);
// 初始化
private void Form_ManagUser_Load(object sender, System.EventArgs e) {
string strSql = "select Name, Password from Users";
('{0}', '{1}', {2})",
SqlCommand command = new SqlCommand (strCommand, DBHelper .Conn);
}
}
command.ExecuteNonQuery();
m_adapterUser.Fill(m_dsUser, "Users" );
catch (System.Data.SqlClient.SqlException ex) { }
MessageBox .Show(ex.Message);
7. 测试计划
一个完整的软件项目必须要有测试这一环节,在开发的过程中,是将整个项目分成若干个小的部分来完成的,由项目小组的不通成员承担不同的任务,虽然在项目之初已经统一好了各个部分的接口,但由于前期实地调研对用户需求的分析并不能很好的与设计项目的具体要求吻合起来,这就难免会造成设计出的软件或是达不到用户的要求,或是有一些功能是多余等等诸多不适应用户或是不适应软件正常运行的因素。那么这些不同的问题必须在项目设计完成后期的测试阶段找出来,通过测试得到不通用户给于的各种反馈信息,进一步完善不足之处,对多余的功能进行删减,不够完整的功能进行完善,尽可能的在不影响全体程序的情况下实现更人性化更完整的软件。
测试进度安排表
8. 设计心得体会
这次图书馆管理系统的设计真是让我绞尽脑汁,经过了两周才做好。其实制
作管理系统我们现在看来已经不是难事,难的是如何去构思,如何去想。
做系统要用心去做,我从中也学到很多知识,知道如何去综合多门学科中的知识,编程能力也有了很大提高,另外也有很多心得体会。
本系统是一个最基本的图书馆管理系统,可扩展性很大,系统的执行效率也比较高。
这些天的设计,我深刻体会到软件开发是相当辛苦的,但成功以后的喜悦也是非常美妙的,投入的越多,获得的快乐与充实感越多。