摘 要
网上图书订阅系统基于 Microsoft SQL Server 2000和ASP.NET平台,以C#为编程语言开发,实现了网上图书预订和借阅,订阅信息查询,图书和用户信息的修改,借阅排行和新到图书的查询等功能,这样不但可将管理员从繁重的劳动中解脱出来,提高管理图书的效率,更重要的是可以使每一位读者足不出户就能够通过上网来轻松订阅图书,查询相关订阅信息。
关键词 : 图书预订;图书借阅;订阅信息查询;图书管理
4.1 系统总体架构
本系统的总体功能结构如图:
图4-1 系统模块图
4.3 系统功能模块设计
图4-2 登录页面
用户在登录框内输入登录信息,系统账号信息记录到Session变量,并判断该密码和账号是否匹配,如果匹配则登录成功,进一步判断该用户是一般用户还是管理员,然后跳转到对应的用户页面。关键代码如下:
string strComm="select * from tb_user where userid='"+userid+"'";//查找用户信息表
…………
if ((sdr["userpassword"].ToString()==userpwd))// 密码正确
{
string strComm1="select * from tb_userkind where kindid='"+sdr["userkind"].ToString()+"'";// 查找该用户权限
…………
if (sdr1["kindname"].ToString()=="管理员")//如果身分是管理员,则跳转到管理员页面
Response.Redirect("admin.aspx?name="+ System.Web.HttpUtility.UrlEncode(sdr["username"].ToString()));
4.3.2 信息查询模块
图4-3 信息查询模块图
管理员可输入账号查看用户信息,也可以浏览的方式查看所有用户信息。以浏览方式查看信息效果图:
图4-4 用户信息浏览
采用数据绑定,将用户信息表中一般用户的账号绑定到DataGrid控件,关键代码如下:
string strComm="select userid,username,userkind from tb_user where userkind='002'";
SqlDataAdapter sda=new SqlDataAdapter(strComm,Conn);
DataSet ds=new DataSet();
sda.Fill(ds,"tb_user");
dg.DataSource=ds.Tables["tb_user"].DefaultView;
dg.DataBind();
细息:
图4-5 用户详细信息
查询馆藏图书信息:
图4-6 图书信息查询
从上图可知,用户根据四种关键字类型选择进行精确或模糊查询,以“编号”,“模糊查询”为例,输入“a”,查询结果如下:
图4-7 查询结果
关键代码如下:
…………
if (rd_id.Checked)// 如果关键字类型为编号
…………
else // 如果为模糊查询
…………
string strComm="select * from tb_book where bookid like '%"+srchkey+"%'";// 查找编号类似的图书
…………
if (ds.Tables["tb_book"].Rows.Count>0)// 查找的图书存在,绑定到控件
{
dg_bk.DataSource=ds.Tables["tb_book"].DefaultView;
dg_bk.DataBind();
}
else
Response.Write("<script>alert(\"类似编号不存在!\");</script");
…………
借阅排行查询:需要访问tb_cntborrow表,这是用来记录所借图书借阅量的表,表中记录的产生是在用户借阅图书时,同时更新tb_cntborrow表中,该图书编号对应的借阅数量。当用户点击“借阅排行”时,按借阅量降序显示。
更新借阅量关键代码如下:
string strcnt="select * from tb_cntborrow where bookid='"+id+"'";// 表中是否已存在该图书
…………//如果有,则借阅量+1更新
{
……………………
string ordnum=sdrstr["ordernum"].ToString();
int ordtim=int .Parse(ordnum)+1;
string updtcnt="Update tb_cntborrow set ordernum='"+ordtim+"' where bookid='"+id+"'";
……………………}
Else // 如果该编号图书不存在,插入图书信息,借阅量设为1
{…………
string strin="insert into tb_cntborrow (bookid,bookname,ordernum)values('"+id+"','"+bkname+"','1')";
…………
借阅超期查询:访问超期信息表tb_overborrow,该表的产生在后面的章节中介绍。新书查询:访问新书信息表tb_newbook。系统规定15天内到馆的图书为新书,新书入库时,系统将新书信息加入该表,在用户页面加载时,删除表内到馆时间超过15天的图书,剩下的即为新书,关键代码如下:
string strComm="select * from tb_newbook";………………
DateTime t1=DateTime.Parse(tim);
TimeSpan ts=DateTime.Now-t1;
int n=ts.Days;
if (n>15)
{ string strComm1="delete from tb_newbook where intime='"+tim+"'";
……………… }
4.3.3 数据管理模块
该模块主要是系统在实现特定功能时,对相关数据表的更新操作,以及根据需要对数据库中的数据进行删除或修改。
图4-8 数据管理模块
预订:首先查找tb_book表中是否有该图书,如果没有,弹出提示信息;如果有,下一步就在tb_user表中查找登录用户,即Session[“User”]的学历,不同的学历允许不同的预订数量,再从tb_reserve预订信息表中查找到该用户的预订数量,如果已达到允许量,则不能继续预订;否则可预订,首先根据需要更新图书暂存信息表tb_bkcache,再将相关信息插入tb_reserve表,并对tb_book表中该编号图书的信息作更新。
以用户学历是本科为例,允许预订数量为2本,实现预订的关键代码如下:
…………
string strsel="select * from tb_book where bookid='"+id+"' ";
// 判断该书是否已被预订、借阅完
…………
if (!sd.Read())
{
Response.Write("<script>alert(\"书已借完\");</script");
}
…………
string strdgr=ds.Tables["tb_user"].Rows[0]["degree"].ToString();// 用户学历
……
int num=(int )Comm3.ExecuteScalar();// 已预订数量
…………
if (strdgr=="本科") {
if (num<2)//满足预订条件,对相关表进行操作
…………
lb_msg.Text="您已预订";// 已达到允许预订量
txb_msg.Text=num.ToString();
lb_msg2.Visible=true ;
lb_msg2.Text="本!";
…………
借阅:不同学历有借阅数量限制,功能实现部分代码跟预订类似,不再累述。所不同的是,借阅后,会更新借阅数量表tb_cntbook,同时,将相关信息插入用户借阅历史表tb_brohistory。更新tb_cntborrow的关键代码如下:
……………
string strcnt="select * from tb_cntborrow where bookid='"+id+"'";// 表中是否已存在该图书
…………//如果有,则借阅量+1更新
{
……………………
string ordnum=sdrstr["ordernum"].ToString();
int ordtim=int .Parse(ordnum)+1;
string updtcnt="Update tb_cntborrow set ordernum='"+ordtim+"' where bookid='"+id+"'";
……………………}
Else // 如果该编号图书不存在,插入图书信息,借阅量设为1
{……………………
String strin="insert into tb_cntborrow (bookid,bookname,ordernum)values('"+id+"','"+bkname+"','1')";
……………………}
归还图书:如果是超期图书,用户不能自行归还,须由管理员处理,借阅时间超过30天,为超期图书;如果没有超期,需做以下处理:将相关信息插入还书记录表tb_return,更新图书信息表tb_book,如果表中该书没借完,则数量+1更新,否则,从tb_bkcache中,找到该图书信息,插入到tb_book,数量设为1,最后,删除tb_borrow中,该条借阅信息。
判断是否超期、超期提示关键代码:
…………
string tim=ds.Tables["tb_borrow"].Rows[0]["ordertime"].ToString();// 获取借阅时间
……
DateTime t1=DateTime.Parse(tim);
TimeSpan ts=DateTime.Now-t1;
…………
if (tover<=3&&tover>0)// 如果没有超期,但离超期时间小于3天
{
Label1.Text="离超期还有";
txb_over.Text=tover.ToString();// 显示离超期还有几天
}
…………
if (ndays>30)
{……
Label1.Text="借阅超期";
txb_over.Text=over.ToString();// 显示超期时间
归还不能完成,显示提示信息:
if (ndays>30)// 如果超期
{
Response.Write("<script>alert(\"书已超期,需由管理员退还!\");</script");
}
Else// 没有超期
{……
string strCm="insert into tb_return(userid,bookid,bookname,returntime)values('"+usrid+"','"+bookid+"','"+bknm+"','"+notim+"')";// 插入到归还记录表
…………}
添
图4-9 新书入库
后台处理时,查找图书类别表tb_bookkind,自动将类别名转换为类别编号,同时将该类别图书编号自动加1更新;入馆时间,默认为系统当前时间,新书信息需要插入到图书信息表和新书表,即tb_book和tb_newbook。
设置新书编号的关键代码如下:
………………
int d=Convert.ToInt32(Comm1.ExecuteScalar());// 将该类编号总数转化为整形
int n=d-1;
………………
string num=ds.Tables["tb_book"].Rows[n]["bookid"].ToString();// 找到最后一条记录的图书编号bookid
string str1=num.Substring(1,4);// 取最后4个字母,如编号为A0006,则取0006
string str2=num.Substring(0,1);// 取第一个字母,如编号为A0006,则取A
…………接下页…………
string str3=(int .Parse(str1)+1).ToString().PadLeft(4,'0');// 先将0006转化为整形,加1,得到7,再在7前添0,补足4位
string bkid=str2+str3;// 将第一个字母与后4位字母相加,如A+0007得到A0007,即新书编号为A0007
………………
string strComm="select * from tb_reserve";
string rsvtim=sdr["reservetime"].ToString();// 获取预订时间
DateTime rsvt1=DateTime.Parse(rsvtim);
TimeSpan rsvts=DateTime.Now-rsvt1;// 到当前时间为止,计算预订时间
int rsvn=3;// 允许预订时间为三天
int rsvndays=rsvts.Days;// 将预订时间转换为天数
// int rsvover=rsvndays-rsvn;
if (rsvndays>3)// 如果大于三天,则为预订超期图书,作处理
…………
string strq=sdr1["quantity"].ToString();// 如果馆内还有该书,则数量加1
int quan=Int32.Parse(strq)+1;
string strUpdate="update tb_book set quantity='"+quan+"'where bookid='"+bkid+"'";
…………
string strIns1="insert into tb_book (bookid,bookname,bookkind,author,publisher,intime,quantity)values('"+bkid+"','"+bknam+"','"+bkknd+"','"+bkaut+"','"+bkpub+"','"+bkinti+"','1')";// 如果馆内无该书,则插入图书信息,数量为1
…………
借阅超期:这是管理员需要了解的信息,因此,在管理员主页加载时,系统将借阅信息表tb_borrow中超期记录插入到超期信息表tb_overborrow。
4.3.4 系统管理模块
该模块主要是为了更好的地管理系统而设计的。
图4-10 系统管理模块
网站计数器:个记录网站访问量,代码如下:
Application.Lock();// 锁定
Application["Count"]=Convert.ToInt32(Application["Count"])+1;
Application.UnLock();// 解锁
lbct.Text=Application["Count"].ToString();
留。
图4-11 留言板
注销: Session值清空,返回登录页面。关键代码为:
Session.Abandon();
Response.Redirect("login.aspx");
系统实施及