ASPNET实训报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机工程系《WEB项目开发》
实
训
报
告
时间: 第11周-第18周
地点: 3405
班级: 软件1001
学号: 20103545
姓名: 陈杨欢
成绩:
2022-04-26
计算机工程系实训报告
目录
1.实训目的 (3)
2.实训内容 (3)
2.1需求分析 (3)
2.1.1概述 (3)
2.1.2系统目标 (3)
2.1.3开发环境 (4)
2.2模块设计 (4)
2.2.2系统功能结构 (5)
2.2.3文件组成结构 (6)
2.2.4主要模块说明 (7)
2.3数据库设计 (8)
2.3.1数据库概要说明 (8)
2.3.2数据库概念设计 (9)
2.3.3数据库逻辑结构设计 (13)
2.4详细制作 (17)
2.4.1图书借阅 (17)
2.4.1.1界面设计 (17)
2.4.1.2后台程序设计 (18)
2.4.1.3技术总结 (23)
2.4.2图书归还 (23)
2.4.2.1界面设计 (23)
2.4.2.2后台程序设计 (24)
2.4.2.3技术总结 (29)
2.4.3读者首页 (30)
2.4.3.1界面设计 (30)
2.4.3.2后台程序设计 (31)
2.4.3.3技术总结 (32)
3.实训总结 (32)
3.1所遇问题和解决方法 (32)
3.2实训感受 (34)
1.实训目的
⑴熟悉图书馆管理系统开发的基本过程。
⑵初步学会针对项目进行分析并设计数据库。
⑶熟悉对SQL Server 2005的使用。
⑷学会设计公共类。
⑸学会用所学知识实现本系统的主要功能模块。
⑹熟悉LINQ语句,一方面体会LINQ语句的简单实用,另一方面也要认识到LINQ语句的局限性。
⑺初步建立面向对象的开发思想。
⑻体会分层开发模块的实用性。
⑼通过本次实训了解自己的知识储备量,争取在今后的学习中弥补自己的不足。
⑽自己遇到了问题,通过询问老师和同学,加强自己的表达和沟通能力。
通过上网查阅资料,可以拓展视野,收获更多知识。
若是分组实训,既可以加强自身的团队协作能力,还可以使自我的能力得到更好的发挥。
2.实训内容
2.1需求分析
2.1.1概述
长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较繁琐。
在借书时,读者首先将要借的书和借阅证交给工作人员,工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,然后在借阅证和每本书贴的借阅条上填写借阅信息。
在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填写相应的还书信息。
从上述描述中可以发现,传统的手工流程存在这种种不足。
首先处理借书、还书业务流程的效率很低;其次处理能力比较低,一段时间内,所能服务的读者人数只能是很有限的。
而且,读者借阅图书相当不方便,这会让读者产生厌烦借书的情绪,不便于知识文化的传播。
为此,图书信息管理系统需要为图书馆及读者解决上述问题,提供快速的信息检索、修改功能及快捷的图书借阅、归还功能。
2.1.2系统目标
根据图书馆日常图书管理工作的需求和图书借阅的管理流程,该系统实施后,应达到以下目标。
⑴界面设计友好、美观,数据存储安全、可靠。
⑵基本信息设置保证图书信息和读者信息的分类管理。
⑶强大的查询功能,保证数据查询的灵活性。
⑷实现对图书借阅、续借、归还过程的全程数据信息跟踪。
⑸实现对图书馆信息的修改功能。
⑹对书架、图书、读者信息的增、删、改、查简易方便。
⑺设置读者借阅和图书借阅排行榜,为图书馆管理提供真实的数据信息。
⑻提供管理员修改自己登录密码的功能,保证系统的安全性。
⑼提供灵活、方便的权限设置功能,使整个系统的管理分工明确。
⑽采用人机对话的操作方式,方便管理员的日常操作。
⑾实现读者对图书的浏览、查询,对个人信息的查看、修改,对已借图书的续借功能。
⑿系统要最大限度地实现易维护性和易操作性。
2.1.3开发环境
⑴网站开发环境
①网站开发环境:Microsoft Visual Studio 2008集成开发环境。
②网站开发语言:+C#+LINQ。
③网站后台数据库:SQL Server 2005。
④开发环境运行平台:Windows XP(SP2)/Windows 2000(SP4)/Windows Server 2003(SP1)。
注意:SP(Server Pack)为Windows操作系统补丁。
⑵服务器端
①操作系统:Windows Server 2003(SP1)。
②Web服务器:Internet信息服务器。
③数据库服务器:SQL Server 2005。
④浏览器:IE6.0及以上版本。
⑤网站服务器运行环境: Framework SDK v2.0。
⑶客户端
①浏览器: IE6.0及以上版本。
②分辨率:最佳效果1024×768像素。
2.2模块设计
2.2.1系统流程图
图 2.2.1.1 系统流程图
2.2.2系统功能结构
根据图书馆管理系统的特点,可以将其分为管理员管理和读者管理两大部分,管理员的管理分为系统设置、读者管理、图书管理、图书借还、系统查询等部分,其中各个部分及其包括的具体功能模块如图2.2.2.1所示。
读者管理包括的功能有图书查询、查看超期公告、查阅基本信息、查看借阅历史、更改口令等,如图2.2.2.2所示。
图 2.2.2.1 系统功能结构图之管理员管理
图 2.2.2.2 系统功能结构图之读者管理
2.2.3文件组成结构
为了直观地看到整个网站的文件组成结构,下图2.2.3.1将网站的组织结构已展示出来。
图2.2.3.1 系统文件组成结构图
2.2.4主要模块说明
entry.aspx页面:管理员登录。
index.aspx页面:管理员登录后进入的第一个页面,即首页。
该页面显示图书借阅的排行榜。
另外,可以通过点击“图书名称”查看图书详细信息。
readerInfo.aspx页面:管理员通过此页面可以浏览所有读者的姓名、性别、类型、证件号、联系方式等信息。
点击“添加读者信息”便会跳转到另一个页面进行读者的添加操作;点击一条记录后的“修改”,可跳转到另一个页面对这个读者的信息进行修改;点击一条记录后的“删除”,可将该读者信息从图书管理数据库中消除。
bookInfoManage.aspx页面:管理员可对图书的档案信息进行增、删、改的操作。
bookBorrow.aspx页面:读者到图书馆借书,管理员只需要输入该读者条形码和所要借的图书条形码,点击相关按钮就可以将读者信息和图书信息显示出来,并可以点击图书信息后的“借阅”按钮,进行借阅。
当然,如果所要借的书是已借出且未归还的,是不允许再外借的。
当该图书被外借后,会生成图书借阅档案保存到数据库中,可供读者进行日后的查阅。
bookReturn.aspx页面:读者将所要还的书(不管是读者本人所借还是其他人所借)拿到图书馆,管理员只需要输入图书条形码,点击相关按钮,就可以显示读者信息和所还图书信息。
点击图书信息记录后的“还书”,即可将此书归还,并生成图书归还档案,以供读者日后查阅。
当然,如果图书是超期归还,就会有相应的提示,管理员根据弹出的提示框可对其进行罚款。
bookBorrowSearch.aspx页面:本页面是图书借阅查询页面。
管理员通过下拉框和单选按钮,搭配选择查询条件,并在文本框中输入相关信息,点击按钮,页面就会自动显示有关图书的借阅信息。
extendedAnn.aspx页面:进入该页面会看到所有的超期未归还的图书及读者的部分信息,管理员也可以在文本框中输入读者的借书证号进行模糊或精确查询。
readerLogin.aspx页面:该页面供读者登录,可以选择输入借阅证号登录或读者条形码登录。
bookSearch.aspx页面:读者通过下拉框选择查询条件,并在其后的文本框中输入相应的内容,点击有关按钮,图书信息就会自动显示在页面中。
例如,读者选择图书类别,而后的下拉框中会显示图书的各种类别,如“小说”、“文学”、“历史”、“哲学”等。
选择过后,点击“检索”按钮,页面就会显示相关图书的大致信息。
若读者要查看其详细信息,点击其后的“详细”,在另一个页面就可以看到此图书的更为详细的信息。
读者可以根据图书信息,决定要不要借阅,如果要借阅,根据图书的馆藏地址、书架、索书号及图书名称很快就可以找到想要借阅的图书,极为方便。
BasicInfor.aspx页面:当读者进入此页面时,可以看到自己的基本信息,并可以修改联系电话、联系地址或电子邮件。
在个人信息下面会显示当前已借阅的图书信息,而且在图书信息后面,有“续借”按钮,这样,足不出门,就可以续借图书。
borrowHistory.aspx页面:这个页面显示的内容是读者本人曾经所有的借阅信息,包括借书信息和还书信息。
updatepassword.aspx页面:此页面供读者更改登录密码所用。
当管理员添加读者时,默认读者登录密码是读者的借阅证号,而后,读者可以登录系统通过此页面更改自己的登录密码,以保安全。
2.3数据库设计
本系统采用SQL Server 2005 数据库,名称为db_tsrj,其中包含9张表。
下面分别给出数据表概要说明、数据表E-R图及主要数据表的结构。
2.3.1数据库概要说明
下面是数据表的树形结构图,如图2.3.1.1所示,其中包含系统所有数据表。
图 2.3.1.1 数据库表结构
2.3.2数据库概念设计
通过对本系统进行的需求分析、系统流程设计、以及系统功能结构的确定,规划出系统中使用的数据库实体对象,具体说明如下。
只有系统分配的用户才可以操作图书馆管理系统,而用户的权限又各不相同。
管理员权限设置信息实体E-R图如图2.3.2.1所示。
图 2.3.2.1 管理员权限设置信息实体E-R图
图书借阅信息实体,用于存储所有图书借阅情况的信息,以准确地记录每本图书的借阅情况。
图书借阅信息实体E-R图如图2.3.2.2所示。
图 2.3.2.2 图书借阅信息实体E-R图
图书馆对图书的分类,通常是将不同类型的图书分别放置在相应类型的书架上。
书架信息实体,用于存储图书馆中所有的书架信息。
书架信息实体E-R图如图2.3.2.3所示。
图 2.3.2.3 书架信息实体E-R图
不同的图书会有不同的图书信息。
对这些图书进行详细的记录,方便图书分类和查询。
图书信息实体,用于存储所有图书的相关信息。
图书信息实体E-R图如图2.3.2.4所示。
图 2.3.2.4 图书信息实体E-R图
图书馆中会有不同类型的图书,为了避免图书归类发生混乱,需建立一个图书类型信息实体,用于存储图书的类型信息。
图书类型信息实体E-R图如图2.3.2.5所示。
图 2.3.2.5 图书类型信息实体E-R图
每个事物都有自身的历史背景,图书馆也不例外。
为了记录和修改图书馆的历史背景及其相关的信息,需要建立一个图书馆信息实体,用于存储与图书馆相关的信息。
图书馆信息实体E-R图如图2.3.2.6所示。
图 2.3.2.6 图书馆信息实体E-R图
每位可到图书馆借阅图书的读者都有自己的基本信息和借阅信息,一方面,方便管理员修改和查询,另一方面,方便自己查询和修改。
读者信息实体,用于存储所有读者的个人信息。
读者信息实体E-R图如图2.3.2.7所示。
图 2.3.2.7 读者信息实体E-R图
去图书馆的可能是教师,可能是学生,可能是工人等,所以读者有不同的类型。
读者类型信息实体用来存储读者类型信息。
读者类型信息实体E-R图如图2.3.2.8所示。
图 2.3.2.8 读者类型信息实体E-R图
当管理员登录图书管理系统时,需要通过登录窗口验证成功后才能进入系统主页。
管理员信息实体,用来存储管理员的登录名称和密码。
管理员信息实体E-R图如图2.3.2.9所示。
图 2.3.2.9 管理员信息实体E-R图
2.3.3数据库逻辑结构设计
在设计完数据库实体E-R图之后,需要根据实体E-R图设计数据表结构。
下面给出各数据表的数据结构和用途。
tb_admSet(管理员权限设置表)。
表tb_admSet用于保存与管理员权限设置相关的信息,该表的结构如表2.3.3.1所示。
表 2.3.3.1 管理员权限设置表
☑ tb_bookBorrow(图书借阅表)。
表tb_bookBorrow用于保存所有借阅和归还图书的信息,该表的结构如表2.3.3.2所示。
☑ tb_bookcase(书架信息表)。
表tb_bookcase用于保存书架的详细信息,该表的结构如表2.3.3.3所示。
表2.3.3.3 书架信息表
☑ tb_bookInfo(图书信息表)。
表tb_ bookInfo用于保存与图书相关的所有信息,该表的结构如表2.3.3.4所示。
表2.3.3.4 图书信息表
☑ tb_bookType(图书类型信息表)。
表tb_ bookType用于保存图书类型信息,该表的结构如表2.3.3.5所示。
表2.3.3.5 图书类型信息表
☑ tb_library(图书馆信息表)。
表tb_ library用于保存图书馆信息,该表的结构如表2.3.3.6所示。
tb_readerInfo(读者信息表)。
表tb_ library用于保存所有读者信息,该表的结构如表2.3.3.7所示。
表2.3.3.7 读者信息表
☑ tb_readerType(读者类型信息表)。
表tb_ library用于保存所有读者类型信息,该表的结构如表2.3.3.8所示。
表2.3.3.8 读者类型信息表
☑ tb_user(管理员信息表)。
表tb_ user用于保存所有管理员信息,该表的结构如表2.3.3.9所示。
表2.3.3.9 管理员信息表
2.4详细制作
2.4.1图书借阅
2.4.1.1界面设计
图 2.4.1.1.1 图书借阅界面设计图
2.4.1.2后台程序设计
public partial class bookBorrow : System.Web.UI.Page
{
MyLinqDataContext db = new MyLinqDataContext();//建立LINQ对象
static int isSum = 0;
protected void Page_Load(object sender, EventArgs e)
{
if (Session["userName"] != null)//判断管理员是否登录
{
if (!getSet())//判断是否拥有权限
{
Response.Write("<script>alert('您没有此权限
');location='index.aspx';</script>");
}
}
else
{
Response.Redirect("entry.aspx");//返回到登录页面
}
}
/// <summary>
/// 自定义方法,返回登录用户的权限
/// </summary>
/// <returns></returns>
public bool getSet()
{
string userName = Session["userName"].ToString();//获取管理员登录名 var sql = db.tb_admSet.Where(p => erName == userName).First(); return Convert.ToBoolean(sql.bookBorrow);//返回是否拥有图书借阅权限 }
/// <summary>
/// 点击“查找读者”按钮,显示读者信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnReaderSearch_Click(object sender, EventArgs e)
{
bindReaderInfo();//调用自定义方法显示读者信息
}
/// <summary>
/// 绑定数据到GridView控件上
/// </summary>
/// <param name="sql"></param>
public void bindGridView(IQueryable sql)
{
gvBookBorrow.DataSource = sql;
gvBookBorrow.DataKeyNames = new string[] { "bookBarCode" };
gvBookBorrow.DataBind();
}
/// <summary>
/// 自定义方法显示读者信息
/// </summary>
public void bindReaderInfo()
{
string readerBarCode = txtReaderBarCode.Text.Trim();//获取读者条形码
var readerSql = db.tb_readerInfo.Where(j => j.readerBarCode == readerBarCode).Count();//在读者信息表中查询符合读者条形码条件的记录数目
if (readerSql > 0)
{
var reader = db.tb_readerInfo.Where(s => s.readerBarCode ==
readerBarCode).First();//获取该读者详细信息
txtReaderName.Text = reader.readerName.ToString(); //显示读者姓名
txtReaderSex.Text = reader.sex.ToString(); //显示读者性别
txtCertificateType.Text = reader.certificateType.ToString();//显示证件类型
txtCertificate.Text = reader.certificate.ToString(); //显示证件号
var typeSdr = db.tb_readerType.Where(m => m.id ==
Convert.ToInt32(reader.readerType)).First();//查询符合读者类型编号的记录
txtReaderType.Text = typeSdr.type.ToString();//显示读者类型
txtNum.Text = reader.canBorrow.ToString();//显示还可以借阅的图书数目
isSum = 1;
}
else
{
RegisterStartupScript("", "<script>alert('读者条形码输入错误!')</script>");
}
}
/// <summary>
/// 点击“查找图书”按钮,根据图书条形码查找图书
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnBookSearch_Click(object sender, EventArgs e)
{
if (isSum > 0)
{
if (Convert.ToInt32(txtNum.Text.Trim()) > 0)//判断读者是否还可以借书
{
if (txtBookBarCode.Text.Trim() != "")//判断图书条形码是否为空
{
string bookBarCode = txtBookBarCode.Text;//获取文本框中图书条形码
if (db.tb_bookInfo.Where(x => x.bookBarCode == bookBarCode).Count() > 0)//判断图书信息表中符合文本框中图书条形码条件的记录数目是否大于0
{
var sql = db.tb_bookInfo.Where(k => k.bookBarCode == bookBarCode);//根据图书条形码获取查询tb_bookInfo表中信息
bindGridView(sql);//传递参数,绑定数据源
}
else
{
RegisterStartupScript("", "<script>alert('图书条形码错误!
')</script>");
}
}
else
{
RegisterStartupScript("", "<script>alert('图书条形码不能为空
')</script>");
}
}
else
{
RegisterStartupScript("", "<script>alert('借阅数量已满!不可以再借阅
')</script>");
}
}
else
{
RegisterStartupScript("", "<script>alert('请先输入正确的读者条形码!')</script>"); }
}
/// <summary>
/// 在对行进行了数据绑定后激发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void gvBookBorrow_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string bookType = e.Row.Cells[1].Text.ToString();//获取图书类型编号
var typeSdr = db.tb_bookType.Where(v => v.typeID ==
Convert.ToInt32(bookType)).First();//在图书类型表中查询符合图书类型编号条件的记录
e.Row.Cells[1].Text = typeSdr.typeName.ToString();//显示图书类型
e.Row.Cells[5].Text = typeSdr.borrowDay.ToString();//显示图书可借天数
e.Row.Cells[6].Text = DateTime.Now.ToString();//显示借书日期
e.Row.Cells[7].Text =
DateTime.Now.AddDays(Convert.ToInt32(typeSdr.borrowDay)).ToString();//显示应归还图书日期
}
}
/// <summary>
/// 在GridView中选择新行时或选择新行前激发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void gvBookBorrow_SelectedIndexChanging(object sender, GridViewSelectEventArgs e) {
string bookBarCode = gvBookBorrow.DataKeys[e.NewSelectedIndex].Value.ToString();//获取GridView控件选中行的数据键值(即该行的图书条形码)
if (db.tb_bookBorrow.Where(b => b.bookBarcode == bookBarCode && b.isReturn == false).Count() > 0)//判断图书借阅表里该书是否归还
{
RegisterStartupScript("", "<script>alert('本书已借出!')</script>");//如果未归还,则弹出提示
}
else
{
var sql = db.tb_bookInfo.Where(code => code.bookBarCode == bookBarCode).First();//查询tb_bookInfo表中符合文本框中图书条形码的记录
var sdr = db.tb_bookType.Where(ty => ty.typeID == sql.bookType).First();//根据图书类型编号查询tb_bookType表中信息
int borrowDay = Convert.ToInt32(sdr.borrowDay);//获取借阅天数
string bookName = sql.bookName.ToString();//获取图书名称
string borrowTime = DateTime.Now.ToString();//获取借阅日期
string readerBarCode = txtReaderBarCode.Text;//获取读者条形码
string returnTime = DateTime.Now.AddDays(borrowDay).ToString(); //获取应还日期
string readerName = txtReaderName.Text;//获取读者姓名
var readerinfo = db.tb_readerInfo.Where(info => info.readerBarCode == readerBarCode).First();//根据读者条形码获取读者信息表中的信息
var bookinfo = db.tb_bookInfo.Where(bi => bi.bookBarCode == bookBarCode).First();//根据图书条形码获取图书信息表中信息
try
{
var addSql = new tb_bookBorrow//将图书借阅信息添加到图书借阅信息表中
{
bookBarcode = bookBarCode,//插入图书条形码
bookName = bookName,//插入图书名称
borrowTime = Convert.ToDateTime(borrowTime),//插入借阅时间
returnTime = Convert.ToDateTime(returnTime),//插入应归还日期
readerID = readerinfo.readerID.ToString(),//插入借阅证号
readerBarCode = readerBarCode,//插入读者条形码
readerName = readerName,//插入读者姓名
sex = readerinfo.sex.ToString(),//插入性别
department = readerinfo.department.ToString(),//插入读者单位
grade = readerinfo.readerType.ToString(),//插入读者类型
renewCount = 0,//插入续借次数
extendedDays = 0,//插入超期天数
FKMoney = 0,//插入罚款金额,默认为0
handlingTime = DateTime.Now,//插入处理时间
operationTypes = "借书",//插入操作类型
isReturn = false//插入未归还
};
db.tb_bookBorrow.InsertOnSubmit(addSql);//准备插入
readerinfo.canBorrow -= 1;//对tb_readerInfo表的可借次数减1
readerinfo.borrowed += 1;//对tb_readerInfo表的已借次数加1
readerinfo.borrowedbookAllnumber += 1;//该读者的外借总数加1
bookinfo.borrowSum += 1;//该图书的借阅总数加1
bookinfo.isReturn = "否";//将该书设置为未归还状态
db.SubmitChanges();//执行插入和更改命令
bindReaderInfo(); //重新绑定读者信息
gvBookBorrow.DataSource = null; //将数据源设置为空
gvBookBorrow.DataBind();//绑定数据
txtBookBarCode.Text = "";//将图书条形码文本框清空
RegisterStartupScript("", "<script>alert('借阅成功!')</script>");
}
catch (Exception ex)
{
MessageBox.Show(this.Page, "借阅失败!" + ex.Message);
}
}
}
}
2.4.1.3技术总结
当管理员登录后才能进入此页面,并且在访问此页面时会判断管理员的权限,只有拥有“图书借还权限”的管理员才能对此进行访问。
当输入错误的读者条形码后点击“查找读者”按钮,会弹出如图2.4.1.3.1所示的对话框。
图 2.4.1.3.1 读者条形码输入错误时的结果
当此书原本已借出且未归还时,点击“借阅”会弹出如图2.4.1.3.2所示的提示信息。
图 2.4.1.3.2 图书已借出的提示框
2.4.2图书归还
2.4.2.1界面设计
图 2.4.2.1.1 图书归还设计页面
2.4.2.2后台程序设计
public partial class bookReturn : System.Web.UI.Page
{
MyLinqDataContext db = new MyLinqDataContext();//建立LINQ对象
protected void Page_Load(object sender, EventArgs e)
{
if (Session["userName"] != null)//判断管理员是否登录
{
if (!getSet())//判断是否拥有权限
{
Response.Write("<script>alert('您没有此权限');location='index.aspx';</script>");
}
}
else
{
Response.Redirect("entry.aspx"); //返回到登录页面
}
}
/// <summary>
/// 自定义方法,返回用户权限
/// </summary>
/// <returns></returns>
public bool getSet()
{
string userName = Session["userName"].ToString();//获取管理员登录名
var sdr = db.tb_admSet.Where(u => erName == userName).First();//根据用户名获取
tb_admSet表中数据
return Convert.ToBoolean(sdr.bookBorrow); //返回是否拥有图书借阅管理权限
}
/// <summary>
/// 自定义方法显示读者信息
/// </summary>
public void bindReaderInfo()
{
string bookBarCode = txtBookBarCode.Text.Trim();
if (bookBarCode != "")
{
if (db.tb_bookBorrow.Where(u => u.bookBarcode == bookBarCode).Count() > 0)
{
if (db.tb_bookBorrow.Where(t => t.bookBarcode == bookBarCode && t.isReturn == false).Count() > 0)
{
var sd = db.tb_bookInfo.Where(u => u.bookBarCode ==
txtBookBarCode.Text.Trim() && u.isReturn == "否").First();
var br = db.tb_bookBorrow.Where(rb => rb.bookBarcode == bookBarCode && rb.isReturn == false).First();
var sdr = db.tb_readerInfo.Where(p => p.readerBarCode ==
br.readerBarCode).First();
txtReaderBarCode.Text = br.readerBarCode.ToString();//显示读者条形码
txtreaderID.Text = br.readerID.ToString();//显示读者借阅证号
txtReaderName.Text = br.readerName.ToString();//显示读者姓名
txtReaderSex.Text = br.sex.ToString();//显示读者性别
txtDepartment.Text = br.department.ToString();//显示读者单位
txtCertificateType.Text = sdr.certificateType.ToString();//显示证件类型
txtCertificate.Text = sdr.certificate.ToString();//显示证件号码
var typeSdr = db.tb_readerType.Where(i => i.id ==
Convert.ToInt32(sdr.readerType)).First();
txtReaderType.Text = typeSdr.type.ToString();//显示读者类型
txtNum.Text = sdr.canBorrow.ToString();//显示还可以借阅的图书数目
}
else
{
RegisterStartupScript("", "<script>alert('该图书已归还!')</script>");
}
}
else
{
RegisterStartupScript("", "<script>alert('图书条形码输入错误或该书未外借!')</script>");
}
}
else
{
RegisterStartupScript("", "<script>alert('图书条形码不能为空')</script>");
}
}
/// <summary>
/// 点击“检索”按钮,根据图书条形码检索
/// 该读者在tb_bookBorrow表中的数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void btnBookSearch_Click(object sender, EventArgs e)
{
bindReaderInfo();
var sql = db.tb_bookBorrow.Where(x => x.bookBarcode == txtBookBarCode.Text.Trim() && x.isReturn == false);
bindGridView(sql);//绑定该读者未归还图书的借阅信息
}
/// <summary>
/// 在GridView中选中行时、选中行前激发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void gvBookReturn_SelectedIndexChanging(object sender, GridViewSelectEventArgs e) {
string nowTime = DateTime.Now.ToString();//获取当前日期
string bookBarcode = gvBookReturn.DataKeys[e.NewSelectedIndex].Value.ToString();//获取当前要归还的图书的编号
var up = db.tb_bookBorrow.Where(u => u.bookBarcode == bookBarcode && u.readerBarCode == txtReaderBarCode.Text.Trim()).First();
var reinfo = db.tb_readerInfo.Where(r => r.readerBarCode ==
txtReaderBarCode.Text.Trim()).First();
var sd = db.tb_bookInfo.Where(u => u.bookBarCode == txtBookBarCode.Text.Trim() &&
u.isReturn == "否").First();
string bookname = up.bookName.ToString();//获取图书名称
DateTime borrowTime = Convert.ToDateTime(up.borrowTime);//获取借阅时间 DateTime retrunTime = Convert.ToDateTime(up.returnTime);//获取应归还时间 string readerID = up.readerID.ToString();//获取借阅证号
string readerBarCode = txtReaderBarCode.Text.Trim();//获取读者条形码
string readerName = up.readerName.ToString();//获取读者姓名
string sex = up.sex.ToString();//获取读者性别
string department = up.department;//获取读者单位
string grade = up.grade;//获取读者级别
int renewCount = Convert.ToInt32(up.renewCount);//获取续借次数
int extendedDays = Convert.ToInt32(up.extendedDays);//获取超期天数
decimal fkmoney = Convert.ToDecimal(up.FKMoney);//获取罚款金额
DateTime handlingTime = DateTime.Now;//获取处理时间
string operationType = "还书";//设置操作类型
bool isReturn = true;//设置为已归还
if ((Convert.ToDateTime(nowTime) - Convert.ToDateTime(borrowTime)) <= (Convert.ToDateTime(retrunTime) - Convert.ToDateTime(borrowTime)))
{
try
{
up.isReturn = isReturn;
var addBorrowInfo = new tb_bookBorrow
{
bookBarcode = bookBarcode,
bookName = bookname,
borrowTime = borrowTime,
returnTime = retrunTime,
readerID = readerID,
readerBarCode = readerBarCode,
readerName = readerName,
sex = sex,
department = department,
grade = grade,
renewCount = renewCount,
extendedDays = extendedDays,
FKMoney = fkmoney,
handlingTime = handlingTime,
operationTypes = operationType,
isReturn = isReturn
};
db.tb_bookBorrow.InsertOnSubmit(addBorrowInfo);//准备插入
reinfo.canBorrow += 1;//tb_readerInfo表中可借数量增1
reinfo.borrowed -= 1;//tb_readerInfo表中已借数量减1
sd.isReturn = "是";//将tb_bookInfo表中该图书是否归还修改为“是”
db.SubmitChanges();//执行插入和更改命令
txtNum.Text = reinfo.canBorrow.ToString();//刷新显示可借图书数量
gvBookReturn.DataSource = null;//将GridView控件数据源设置为空
gvBookReturn.DataBind();//绑定GridView控件
txtBookBarCode.Text = "";//将显示图书条形码设置为空
RegisterStartupScript("", "<script>alert('归还成功!')</script>");
}
catch (Exception es)
{
MessageBox.Show(this.Page, "归还失败!" + es.Message);
}
}
else
{
try
{
string fk = (Convert.ToDateTime(nowTime) -
Convert.ToDateTime(retrunTime)).TotalDays.ToString();//超期天数=当前日期-应归还日期
double fk1 = Convert.ToDouble(fk);
int fk2 = Convert.ToInt32(fk1);
double fk3 = fk2 * 0.50;//(总罚款额)=(超期天数)*(超期后每天罚款金额)
MessageBox.Show(this.Page, "超期" + fk2 + "天,罚款金额:" + fk3.ToString("0.00") + "元");
up.isReturn = isReturn;
var addBorrowInfo2 = new tb_bookBorrow
{
bookBarcode = bookBarcode,
bookName = bookname,
borrowTime = borrowTime,
returnTime = retrunTime,
readerID = readerID,
readerBarCode = readerBarCode,
readerName = readerName,
sex = sex,
department = department,
grade = grade,
renewCount = renewCount,
extendedDays = fk2,
FKMoney = Convert.ToDecimal(fk3),
handlingTime = handlingTime,
operationTypes = operationType,
isReturn = isReturn
};
db.tb_bookBorrow.InsertOnSubmit(addBorrowInfo2);//准备插入
reinfo.canBorrow += 1;
reinfo.borrowed -= 1;
sd.isReturn = "是";
db.SubmitChanges();//执行插入和更改命令
txtNum.Text = reinfo.canBorrow.ToString();//刷新显示可借图书数量
gvBookReturn.DataSource = null;//将GridView控件数据源设置为空
gvBookReturn.DataBind();//绑定GridView控件
txtBookBarCode.Text = null;//将显示图书条形码设置为空
RegisterStartupScript("", "<script>alert('归还成功!')</script>");
}
catch (Exception ex)
{
MessageBox.Show(this.Page, "归还失败!" + ex.Message);
}
}
}
/// <summary>
/// 绑定该读者未归还图书的借阅信息
/// </summary>
/// <param name="sql"></param>
public void bindGridView(IQueryable sql)
{
gvBookReturn.DataSource = sql;
gvBookReturn.DataKeyNames = new string[] { "bookBarCode" };
gvBookReturn.DataBind();
}
}
2.4.2.3技术总结
管理员不能直接访问此页面,必须要登录后且具有图书借还管理的权限才能进行访问,判断管理员是否具有该管理权限,需要调用方法getSet()。
当输入正确的图书条形码但是该图书却已经归还了,点击“检索”按钮,会弹出如图2.4.2.3.1所示的对话框。
图 2.4.2.3.1 图书已经归还的提示框
当输入的图书条形码有错或该书未外借时,点击“检索”会弹出如图2.4.2.3.2所示的对话框。
图 2.4.2.3.2 图书条形码错误或该书未外借的提示
如果所归还的图书已经超期,得对读者进行罚款。
这就涉及到判断该图书是否超期,如果超期,需计算超期天数和罚款金额。
超期罚款提示如图2.4.2.3.3所示。
图 2.4.2.3.3 超期罚款提示
2.4.3读者首页
2.4.
3.1界面设计
图 2.4.3.1.1 读者登录后进入的首页
2.4.
3.2后台程序设计
<script language="javascript" src="../jquery-1.6.2.min.js" type="text/javascript"></script>
<script type="text/javascript" language="javascript">
function marquee1()
{
document.write("<marquee behavior=scroll direction=up width=320 height=135 scrollamount=1 scrolldelay=60 onmouseover='this.stop();' onmouseout='this.start()'>")
}
function marquee2()
{
document.write("</marquee>")
}
</script>
<script type="text/javascript" language="javascript">
var t;
var speed = 2;//图片切换速度
var nowlan=0;//图片开始时间
function changepic() {
var imglen = $("div[id='pic']").find("div").length;
$("div[id='pic']").find("div").hide();
$("div[id='pic']").find("div").eq(nowlan).show();
nowlan = nowlan+1 ==imglen ?0:nowlan + 1;
t = setTimeout("changepic()", speed * 1000);
}
onload = function () { changepic(); }
$(document).ready(function () {
//鼠标在图片上悬停让切换暂停
$("div[id='pic']").hover(function () { clearInterval(t); });
//鼠标离开图片切换继续
$("div[id='pic']").mouseleave(function () { changepic(); });
});
</script>
2.4.
3.3技术总结
该页面的代码主要用来实现幻灯片和跑马灯效果。
幻灯片展示图书馆的照片,跑马灯显示最新标准和最新公告。
主要代码如上的后台程序设计。
3.实训总结
3.1所遇问题和解决方法
本系统是在原系统的基础上改造而成,尤其是针对.cs页面代码,将原来的SQL语句替换为了LINQ语句。
相对SQL语句而言,LINQ语句较为简练,无需复杂的学习过程即可上手,但是运行起来较慢。
在实训过程中,我原以为不能像SQL语句那样进行带参数方法的调用,于是在一些方法当中重复写代码,致使代码量大大增加。
后来,问老师才知道,可以进行带参方法的调用。
例如,我在bookReturn.cs 中,写了如下代码:
/// <summary>
/// 点击“检索”按钮,根据图书条形码检索
/// 该读者在tb_bookBorrow表中的数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void btnBookSearch_Click(object sender, EventArgs e)
{
bindReaderInfo();
var sql = db.tb_bookBorrow.Where(x => x.bookBarcode == txtBookBarCode.Text.Trim() && x.isReturn == false);
bindGridView(sql);//绑定该读者未归还图书的借阅信息
}
/// <summary>
/// 绑定该读者未归还图书的借阅信息。