ASP.NET网上图书订阅系统的设计

 

网上图书订阅系统基于 Microsoft SQL Server 2000和ASP.NET平台,以C#为编程语言开发,实现了网上图书预订和借阅,订阅信息查询,图书和用户信息的修改,借阅排行和新到图书的查询等功能,这样不但可将管理员从繁重的劳动中解脱出来,提高管理图书的效率,更重要的是可以使每一位读者足不出户就能够通过上网来轻松订阅图书,查询相关订阅信息。

关键词图书预订;图书借阅;订阅信息查询;图书管理

4.1  系统总体架构

本系统的总体功能结构如图:

图4-1 系统模块图

4.3  系统功能模块设计

4.3.1  登录模块

图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");

系统实施及

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/596821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础之makefile/make

目录 一、背景 二、makefile和make的讲解 2.1 使用方法 2.2 伪目标文件 2.3 文件的属性以及属性的更新 2.4 makefile的自动推导 一、背景 这里会提及为什么要使用makefile和make&#xff0c;以及他们是什么和作用。 会不会写makefile&#xff0c;从一个侧面说明了一个人是…

宝兰德通过广东教育行业信创适配认证,拓展教育信创生态圈

近日&#xff0c;由宝兰德自主研发的多款中间件产品通过广东省教育行业信创适配中心的适配测试。测试表明&#xff0c;宝兰德四款中间件产品&#xff08;分布式缓存软件V3.0、应用服务器软件V9.5、消息中间件软件 V2.1、Web服务器软件V3.1&#xff09; 与当前主流国产操作系统统…

memory consistency

memory consistency model 定义了对于programmer和implementor来说&#xff0c;访问shared memory system的行为&#xff1b; 对于programmer而言&#xff0c;他知道期望值是什么&#xff0c; 知道会返回什么样的数据&#xff1b;&#xff1b; 对于implementro而言&#xff0c;…

数据结构——链表专题1

文章目录 一、移除链表元素二、反转链表三、合并两个有序链表四、链表的中间节点五、环形链表的约瑟夫问题六、分割链表 一、移除链表元素 原题链接&#xff1a;移除链表元素 一个解法是遍历原链表&#xff0c;将与val相等的结点抛弃&#xff0c;链接后一个结点 另一个解法是…

corefBERT论文阅读

CorefBERT是清华大学团队发表的&#xff0c;继SpanBERT之后另一针对共指消解的BERT模型。共指消解任务对于文本理解、智能问答等其他NLP子任务起到至关重要的作用。 为了提高语言模型的共指推理能力&#xff0c;一个简单的解决方案是使用有监督的共指解析数据在bert等模型进行…

论文笔记ColdDTA:利用数据增强和基于注意力的特征融合进行药物靶标结合亲和力预测

ColdDTA发表在Computers in Biology and Medicine 的一篇一区文章 突出 • 数据增强和基于注意力的特征融合用于药物靶点结合亲和力预测。 • 与其他方法相比&#xff0c;它在 Davis、KIBA 和 BindingDB 数据集上显示出竞争性能。 • 可视化模型权重可以获得可解释的见解。 …

Linux网络部分——DNS域名解析服务

目录 1. 域名结构 2. 系统根据域名查找IP地址的过程 3.DNS域名解析方式 4.DNS域名解析的工作原理【☆】 5.域名解析查询方式 6.搭建主从DNS域名服务器 ①初始化操作主服务器和从服务器&#xff0c;安装BIND软件 ②修改主服务器的主配置文件、区域配置文件、区域数…

【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef

文章目录 1.数据类型&#xff1a;编译器&#xff08;compiler&#xff09;与解释器&#xff08;interpreter&#xff09;&#xff0c;中文里的汉字和标点符号是两个字节&#xff0c;不能算一个字符&#xff08;单引号&#xff09;2.运算符/循环&#xff1a;sizeof/size_t3.数组…

基于java的CRM客户关系管理系统的设计与实现(论文 + 源码 )

【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展&#xff0c;市场经济的信息化&#xff0c;让企业之间的竞争变得&#xff0…

复写零(双指针)

下面的解法需要手动画图&#xff0c;举例去体会&#xff0c;只有自己手动去做了&#xff0c;才会有所收获。 class Solution {public void duplicateZeros(int[] arr) {int n arr.length;//先找到最后一个元素的位置;//至于为什么要直接先设dest 为-1&#xff0c;这是经过研究…

CNN笔记详解

CNN(卷积神经网络) 计算机视觉&#xff0c;当你们听到这一概念的是否好奇计算机到底是怎样知道这个图片是什么的呢&#xff1f;为此提出了卷积神经网络&#xff0c;通过卷积神经网络&#xff0c;计算机就可以识别出图片中的特征&#xff0c;从而识别出图片中的物体。看到这里充…

分布式与一致性协议之ZAB协议(四)

ZAB协议 ZooKeeper是如何选举领导者的。 首先我们来看看ZooKeeper是如何实现成员身份的&#xff1f; 在ZooKeeper中&#xff0c;成员状态是在QuorumPeer.java中实现的&#xff0c;为枚举型变量 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING }其实&…

为何美国多IP服务器是全自动内容采集站的最佳选择?

为何美国多IP服务器是全自动内容采集站的最佳选择? 在建设全自动内容采集站时&#xff0c;选择合适的服务器至关重要。而在众多选项中&#xff0c;美国多IP服务器被认为是最佳选择&#xff0c;究竟为何呢?本文将从多个方面进行深入探讨。 为何美国多IP服务器是全自动内容采集…

分享8000网剧资源

兄弟们&#xff0c;前段时间搞短剧&#xff0c;收集了8500多部网剧资源。搞了整整两个月就赚3块两毛八&#xff0c;电费都不够。还不如进厂打螺丝。果断放弃这项目。 资源在手里面也没啥用。分享出来&#xff0c;大家看着玩。 有其他好的网络项目也可以分享分享。也可也一起…

真希望我父母读过这本书的笔记(二)

系列文章目录 真希望我父母读过这本书的笔记&#xff08;一&#xff09; 真希望我父母读过这本书的笔记&#xff08;二&#xff09; 文章目录 系列文章目录PART 5 培养心理健康的孩子亲子关系决定心理健康互动及来回交流如何开始交流互看游戏交流恐惧症 若遇棘手之际&#xff0…

9.Admin后台系统

9. Admin后台系统 Admin后台系统也称为网站后台管理系统, 主要对网站的信息进行管理, 如文字, 图片, 影音和其他日常使用的文件的发布, 更新, 删除等操作, 也包括功能信息的统计和管理, 如用户信息, 订单信息和访客信息等. 简单来说, 它是对网站数据库和文件进行快速操作和管…

[Flutter]创建一个私有包并使用

在Flutter中创建一个自己的私有组件&#xff08;通常称为包或库&#xff09;&#xff0c;并通过Dart的包管理工具pub进行使用。 一、创建一个新的Flutter包 1.使用命令行创建 使用Flutter命令行工具来创建一个新的包&#xff1a; $ flutter create --templatepackage my_pri…

嵌入式复习重点

嵌入式系统有多种表现形式&#xff0c;包括计算机MCU、SOC片上系统、SOPC片上系统、GPU和FPGA等。 MCU(微控制器): 是最基本也是最常见的嵌入式系统形式,是集成了CPU、ROM、RAM、IO口、定时器、中断控制器等组件的单一芯片。MCU广泛用于电器电子产品的控制。SoC(系统片上芯片):…

P8800 [蓝桥杯 2022 国 B] 卡牌

P8800 [蓝桥杯 2022 国 B] 卡牌 分析 “最多” -- 二分 1.二分区间&#xff08;凑齐的卡牌套数&#xff09;&#xff1a; l&#xff1a;a[]min&#xff1b;r&#xff1a;(a[]b[])max 2.check(x)&#xff1a; &#xff08;1&#xff09;for循环内&#xff1a; 判断x - a[i…

Enhancing Diffusion——利用三维透视几何约束增强扩散模型

概述 透视在艺术中被广泛研究&#xff0c;但现代高质量图像生成方法却缺乏透视精度。新的生成模型引入了几何约束&#xff0c;通过训练过程提高透视精度。这样可以生成更逼真的图像&#xff0c;并提高相关深度估计模型的性能。 最近的图像生成技术使研究人员能够创造性地进行…