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.mzph.cn/web/7252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Elasticsearch<四>✈️✈️】SpringBoot 项目整合 Elasticsearch

目录 &#x1f378;前言 &#x1f37b;一、Elasticsearch 本地环境启动 &#x1f37a;二、SpringBoot 项目整合 Elasticsearch 2.1 引入 ES 依赖 2.2 配置 ES 属性 2.3 创建实体类 2.4 操作 ES 的工具类 2.5 操作 ES 的业务层 &#x1f379;三、接口测试 3.1 编写测试类 3…

外贸企业邮箱是什么?做外贸企业邮箱哪个好?

外贸企业邮箱是什么&#xff1f;外贸企业在进行跨国沟通时必不可少的工具就是外贸企业邮箱&#xff0c;外贸企业邮箱需要具备的条件就是海外邮件抵达率高、安全稳定、多语言沟通。而我们又怎么选择一个适合的外贸企业邮箱呢&#xff1f;小编今天带您一起了解。 一、外贸企业邮…

【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕汉字显示示例

所需模块micropython-ssd1306模块 中文下载站&#xff1a;https://www.cnpython.com/pypi/micropython-ssd1306/download 官方下载站&#xff1a;https://pypi.org/project/micropython-ssd1306/ 汉字取模说明 取模工具&#xff1a;pctolcd2002取模方式&#xff1a; UTF-8字…

华为 二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量。它可以帮助防止未经授权的访问&#xff0c;保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量&#xff0c;例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

嵌入式系统应用-拓展-FLASH之操作 SFUD (Serial Flash Universal Driver)之KEIL移植

1 SFUD介绍 1.1 初步介绍 SFUD 是一个开源的串行 SPI 闪存通用驱动库。由于市面上有各种类型的串行闪存设备&#xff0c;每种设备都具有不同的规格和指令&#xff0c;因此 SFUD 的设计目的是解决这些差异。这使得我们的产品可以支持不同品牌和规格的闪存&#xff0c;增强了软…

408数据结构-树与森林 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 树的存储结构 树既可以采用顺序存储结构&#xff0c;又可采用链式存储结构。但无论采取哪种方式&#xff0c;都要求能够唯一地反映树中各结点之间的逻辑关系。 1. 双亲表示法 这种存储结构采用一组连续空间来存储每个结点&#xff0…

「C++ 内存管理篇 00」指针

目录 一、变量&#xff0c;变量名和指针 1. 什么是变量&#xff1f; 2. 变量名和指针 3. 使用指针获取数据 二、指针变量和数组变量 三、编译器对指针的等级有着严格的检查 四、指针的加减 1. 存放指针的变量的加减 2. 存放指针的变量的自增自减 3. 两个指针相减 一、变量&…

【一步一步了解Java系列】:探索Java基本类型转换的秘密

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹。 如果喜欢能否点个赞支持一下&#…

内网端口转发与代理

思路&#xff1a;渗透的前提是双方能够建立通信。目前无法和win7建立通信&#xff0c;但是拿到了windows2003的权限&#xff0c;所以可以在Windows2003主机上面建立节点&#xff0c;作为跳板机去访问到内网。 目前状态&#xff1a;控制win2003&#xff08;IP&#xff1a;192.1…

活动回放 | 如何进行全增量一体的异构数据库实时同步

以 AI领域为代表的新技术不断涌现&#xff0c;新的应用风口也逐渐清晰。为了加紧跟上技术发展的步伐&#xff0c;越来越多的企业开始着手&#xff0c;对仍以传统关系型数据库为主的应用后端进行现代化升级。 这就涉及到如何在不影响并保持现有业务系统正常运转的前提下&#xf…

软件测试产品交付包括哪些内容?

软件测试产品交付通常会包括以下内容: 1. 测试计划:详细的测试方案、测试范围、测试资源与时间安排等内容。 2. 测试用例:包括功能测试用例、性能测试用例、安全测试用例等各类测试用例。 3. 测试环境:包括硬件环境、软件环境、网络环境、数据环境等测试所需要的各种环境。 4. …

LeetCode 面试题 17.14 —— 最小 k 个数

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 第一种方法就是利用快速排序&#xff0c;第一次排序后&#xff0c;数组被划分为了左右两个区间 [ 0 , i ] , [ i 1 , a r r . s i z e ( ) − 1 ] [0, i], [i1, arr.size()-1]…

Docker入门指南:Docker容器的部署(一)

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 当今软件开发领域中&#xff0c;Docker 成为了一种流行的容器化技术。Docker 可以帮助开发者将应用程序及其依赖项打包到一个独立且可移植的容器中&#xf…

Hibernate 元数据模型(MetaModel)提示类没有找到错误

在进行一次编译的时候&#xff0c;提示下面的错误信息&#xff1a; java: java.lang.ClassNotFoundException: org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor 问题和解决 如果你对 Hibernate 的元数据还是不非常了解的话&#xff0c;请参考文章&#xff1a; JPA 的…

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据+计算过程+计算结果)

2002-2021年各地区平均受教育年限数据&#xff08;分性别&#xff09;&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2002-2021年 2、来源&#xff1a;国家统计局、统计年鉴、各省年鉴 3、指标&#xff1a;行政区划代码、地区、年份、人均受教育年…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准&#xff0c;C的第一次更新是C03&#xff0c;但由于C03基本上是对C98缺陷的修正&#xff0c;所以一般把C98与C03合并起来&#xff0c;叫做C98/03&#xff1b; 后来原本C委员会更新的速度预计是5年更新一次&#xff0c;但由于C标准委员会的进…

Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《Linux环境下的事件驱动力量&#xff1a;探索Libevent的高性能I/O架构》&#xff0c;在这篇文章中&#xff0c;你将会学习到Libevent的高性能I/O原理以及应用&#xff0c;并且我会给出源码…

一竞技MSI:淘汰赛抽签结果出炉 BLG和T1同半区,TES首轮交手TL!

北京时间5月6日&#xff0c;MSI在今天进入短暂的休赛&#xff0c;在昨天结束的入围赛之后&#xff0c;PSG战队作为外卡赛区唯一的队伍进入到正赛&#xff0c;另外欧洲赛区的FNC战队也是击败GAM战队拿到正赛的资格。在比赛结束之后&#xff0c;也是进行了淘汰赛的胜败分组赛的抽…

Llama3-Tutorial之LMDeploy高效部署Llama3实践

Llama3-Tutorial之LMDeploy高效部署Llama3实践 Llama 3 近期重磅发布&#xff0c;发布了 8B 和 70B 参数量的模型&#xff0c;lmdeploy团队对 Llama 3 部署进行了光速支持&#xff01;&#xff01;&#xff01; 书生浦语和机智流社区同学光速投稿了 LMDeploy 高效量化部署 Llam…

OpenHarmony实战开发-上传文件

Web组件支持前端页面选择文件上传功能&#xff0c;应用开发者可以使用onShowFileSelector()接口来处理前端页面文件上传的请求。 下面的示例中&#xff0c;当用户在前端页面点击文件上传按钮&#xff0c;应用侧在onShowFileSelector()接口中收到文件上传请求&#xff0c;在此接…