图书管理项目

Posted HPeak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图书管理项目相关的知识,希望对你有一定的参考价值。

项目搭建

1.导入原型

  只有前端页面,但没有后端代码的项目。即一个只有页面但没有功能的项目!

  导入原型:

  1. 创建一个web项目,命名为goods;
  2. 把原型的webroot和src两个目录copy到goods中,覆盖原有的文件夹;
  3. 把goods发布到tomcat上,打开浏览器,访问主页。

2.前台需求分析

前台是针对会员购书,而后台是管理员管理系统并完成售书。

2.1 前台主页

    /index.jsp使用<jsp:forward>转发到/jsps/main.jsp,、main.jsp中只有一个<table>,结构如下:

            main.jsp

             

    <table>中各个部分使用的是<iframe>完成的框架页。

    (1):/jsps/top.jsp;

    (2):/jsps/left.jsp;

    (3):/jsps/searchj.jsp;

    (4):/jsps/body.jsp

    在(1)、(2)、(3)部分都存在超链接或表单,无论点击哪个超链接(或提交表单)都会在(4)部分显示

2.2 模块划分

  系统分为如下模块:

  1. 用户模块
  2. 分类模块
  3. 图书模块
  4. 购物车模块
  5. 订单模块

 

2.3前台用户模块

用户模块功能有:

  1. 注册
  2. 激活
  3. 登录
  4. 修改密码
  5. 退出

 

2.4前台分类模块

分类模块功能有:

  1. 显示所有分类;

 

2.5前台图书模块

  1. 前台图书模块功能有:
  2. 分页查看指定分类的图书;
  3. 分页查看指定名称的图书;
  4. 分页查看指定条件的图书;
  5. 查看图书详细信息。

 

2.5购物车模块

  1. 购物车模块功能有:
  2. 向车中添加条目;
  3. 查看我的购物车;
  4. 修改条目数量;
  5. 删除条目;
  6. 批量删除条目;

 

2.6前台订单模块

前台订单模块功能有:

  1. 生成订单;
  2. 查看我的订单;
  3. 查看订单详细信息;
  4. 取消订单;
  5. 确认收货;
  6. 支付订单;

 

3.后台需求分析

后台是管理员管理系统,以售书功能。

 3.1 后台主页

与前台主页一样,使用框架页。

3.2管理员模块

管理员模块功能有:

  1. 管理员登录;
  2. 管理员退出;

 

3.3后台分类管理

后台分类管理功能有:

  1. 查看所有分类;
  2. 添加一级分类;
  3. 添加二级分类;
  4. 编辑一级分类;
  5. 编辑二级分类;
  6. 删除一级分类;
  7. 删除二级分类;

3.4后台图书管理

               

 后台图书管理功能有:

  1. 分页查看指定分类的图书;
  2. 分页查看指定条件的图书;
  3. 添加新图书;
  4. 编辑图书;
  5. 删除图书;

3.5 后台订单管理

后台订单管理功能有:

  1. 分页查看所有订单;
  2. 分页查看指定状态的订单;
  3. 查看订单详细信息;
  4. 订单发货;
  5. 取消订单;

 

4数据模型设计

根据需求分析,得到如下实体:

  1. User:会员;
  2. Category:图书分类;
  3. Book:图书;
  4. CartItem:购物车条目;
  5. Order:订单;
  6. OrderItem:订单条目;
  7. Admin:管理员。

4.1 t_user表

列名

列类型

描述

uid

char(32)

主键

loginname

varchar(50)

会员登录名

loginpass

varchar(50)

会员登录密码

email

varchar(50)

邮箱地址

status

boolean

是否已激活

activationCode

char(64)

激活码

4.2 t_category表

列名

列类型

描述

cid

char(32)

主键

cname

varchar(50)

图书分类名称

pid

char(32)

外键,相对本表的cid,表示父分类id。

desc

varchar(100)

分类描述

orderBy

int

分类序号,用来排序。

4.3 t_book表

列名

列类型

描述

bid

char(32)

主键

bname

varchar(200)

图书名称

author

varchar(50)

图书作者

price

decimal(8,2)

定价

currPrice

decimal(8,2)

当前价

discount

decimal(3,1)

折扣

press

varchar(100)

出版社

edition

int

版次

pageNum

int

页数

wordNum

int

字数

printtime

char(10)

印刷时间

booksize

int

开本

paper

varchar(50)

纸质

cid

char(32)

所属分类id

image_w

varchar(100)

大图路径

image_b

varchar(100)

小图路径

orderBy

int

序号

 

4.4 t_cartitem表

列名

列类型

描述

cartItemId

char(32)

主键

quantity

int

数量

bid

char(32)

图书id

uid

char(32)

当前会员id

orderBy

int

序号

 

4.5 t_order表

列名

列类型

描述

oid

char(32)

主键

ordertime

char(19)

下单时间

total

decimal(10,2)

合计金额

status

int

订单状态:1 未付款、2 未发货、3 未收货、4 交易成功、5 已取消

address

varchar(1000)

收货地址

uid

char(32)

当前会员id

 

4.6 t_orderitem

列名

列类型

描述

orderItemId

char(32)

主键

quantity

int

数量

subtotal

decimal(8,2)

金额小计

bid

char(32)

图书id

bname

varchar(200)

图书名称

currPrice

decimal(8,2)

当前价

image_b

varchar(100)

小图路径

oid

char(32)

所属订单id

 

4.7 t_admin

列名

列类型

描述

adminId

char(32)

主键

adminname

varchar(50)

管理员登录名

adminpwd

varchar(50)

管理员密码

                                                

5项目框架

5.1导包

项目所需要导什么包,要从项目所使用的工具来计算。本项目需要使用工具如下:

  1. c3p0;
  2. commons-beanutils;
  3. commons-dbutils;
  4. commons-fileupload;
  5. commons-fileupload.jar;
  6. javamail;
  7. Log4J;
  8. mysql-connector;
  9. itcast-tools。 

5.2配置文件

本项目使用了C3P0数据库连接池,所以需要在src下配置c3p0-config.xml文件。模板如下:

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8" ?>

<c3p0-config>

    <default-config>

       <property name="jdbcUrl">jdbc:mysql://localhost:3306/goods</property>

       <property name="driverClass">com.mysql.jdbc.Driver</property>

       <property name="user">root</property>

       <property name="password">123</property>

      

       <property name="acquireIncrement">3</property>

       <property name="initialPoolSize">10</property>

       <property name="minPoolSize">2</property>

       <property name="maxPoolSize">10</property>

    </default-config>

</c3p0-config>

 

5.3建包

包名的结构一般为:公司域名.项目名.模块名称.分层名称。本项目的包大致如下:

  1. cn.itcast.goods.user.domain;
  2. cn.itcast.goods.user.dao;
  3. cn.itcast.goods.user.service;
  4. cn.itcast.goods.user.web.servlet;
  5. cn.itcast.goods.category.doamin;
  6. cn.itcast.goods.category.dao;
  7. cn.itcast.goods.category.service;
  8. cn.itcast.goods.category.web.servlet;
  9. cn.itcast.goods.book.domain;
  10. cn.itcast.goods.book.service;
  11. cn.itcast.goods.book.web.servlet;
  12. cn.itcast.goods.cart.domain;
  13. cn.itcast.goods.cart.dao;
  14. cn.itcast.goods.cart.service;
  15. cn.itcast.goods.cart.web.servlet;
  16. cn.itcast.goods.order.domain;
  17. cn.itcast.goods.order.dao;
  18. cn.itcast.goods.order.service;
  19. cn.itcast.goods.order.web.servlet;
  20. cn.itcast.goods.web.filter;
  21. cn.itcast.goods.admin.admin.domain;
  22. cn.itcast.goods.admin.category.web.servlet;
  23. cn.itcast.goods.admin.book.web.servlet;
  24. cn.itcast.goods.admin.order.web.servlet。

5.4JQuery异步请求

本项目的页面中使用JQuery来完成表单的校验,而且还使用了JQuery的AJAX。这里简单回顾一下使用JQuery发送异步请求的过程。

使用JQuery发送异步请求最为灵活的方法是ajax()方法,该方法只有一个参数,参数为一个JSON对象,下面来看看这个对象的属性。

  1. async:默认为true,表示发送异步请求。
  2. beforeSend:函数类型。该函数会在发送请求前被调用,可以用来设置自定义的HTTP报头。该函数有一个参数为XMLHttpRequest类型,我们可以使用它完成底层AJAX的设置,如果该函数返回false,那么当前请求会被取消。
  3. cache:默认为true,表示是否在浏览器缓存中加载信息。当dataType为script时,该属性为false。
  4. complete:函数类型,无论请求是否成功,当请求结束时调用它。该函数有两个参数,function (XMLHttpRequest, textStatus)。
  5. contentType默认为application/x-www-form-urlencoded,一般无需修改该属性。
  6. data:请求参数,格式为{key1:val1,key2:val2…}。如果val为数组那么会被转换为多个参数,例如{key:[val1,val2]}转换为key=val1&key=val2。
  7. dataType:可选值为xml、html、script、json、jsonp、text。表示服务器的响应数据的类型。
  8. type:默认为GET,表示请求方式。POST和GET使用的比较多。
  9. url:请求的服务器资源,可以是一个htmlxmljspServlet等。
  10. success:请求成功调用的函数。函数形如fun(data,status),其中data为通过dataType进行了转换的服务器响应数据。
  11. error:请求失败时调用的函数。函数形如fun(XMLHttpRequest, status, errorThrown) 。

常用属性有6个:

  • url:要请求的服务器端地址
  • dataType:服务器返回数据的类型,我们通常用json;
  • data:客户端发送给服务器的参数;
  • type:请求方法,可以是GET或POST
  • async:是否为异步(如果为true,那么是用两个线程来完成,否则是一个线程)
  • cache:客户端是否缓存数据。
  • success:成功是调用的方法。

 

例如:

    <script type="text/javascript" src="<c:url value=\'/js/jquery-1.5.1.js\'/>"></script>

    <script type="text/javascript">

$(function() [q1] {

    $("#btn").click([q2] function() {

       var name = $("#name").val();

       if(name) {

           $.ajax[q3] ({

              async: false,

              cache: false,

              type: "POST"[q4] ,

              dataType: "json"[q5] ,

              url[q6] : "<c:url value=\'/AjaxServlet\'/>",

              data[q7] : {method: "findByName", name: name},

              success[q8] : function(person) {

                  $("#person").text(person.pid + ", " + person.name + ", " + person.age + ", " + person.birthday);

              }

           });

       }

    });

});

    </script>

  <body>

      请输入姓名:<input type="text" id="name" name="name"/>

      <input type="submit" value="查询" id="btn"/>

   <div id="person"></div>

  </body>

public class AjaxServlet extends BaseServlet {

    public String findByName[q9] (HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       String name = request.getParameter("name")[q10] ;

       PersonDao dao = new PersonDao();

       try {

           Person person = dao.findByName(name);

           StringBuilder sb = new StringBuilder();

           sb.append("{");

           sb.append("\\"pid\\":").append("\\"").append(person.getPid()).append("\\",");

           sb.append("\\"name\\":").append("\\"").append(person.getName()).append("\\",");

           sb.append("\\"age\\":").append("\\"").append(person.getAge()).append("\\",");

           sb.append("\\"birthday\\":").append("\\"").append(person.getBirthday()).append("\\"");

           sb.append("}");

[q11]           response.getWriter().print(sb);[q12] 

       } catch (SQLException e) {

           throw new RuntimeException(e);

       }

       return null;

    }

}

 

6页面结构

6.1目录介绍 

 

在WebRoot下有很多文件夹,下面我们对这些文件夹进行介绍:

  1. adminjsps:后台管理jsp页面;
  2. bank_img:银行图片,在线支付时,会员需要选择支付的网银,这个页面需要显示这些图片;
  3. book_img:每本书都要有大图和小图,图书的图片都在这个文件夹中;
  4. css:公共css样式文件;
  5. images:按钮图片;
  6. jquery:jquery的源代码;
  7. js:公共js脚本;
  8. jsps:前台会员购书jsp页面;
  9. menu:javascript小工具,在前台首页的左部就是使用的这个小工具来显示图书分类的。

6.2jsps目录介绍

jsps目录下是前台页面:

 

index.jsp中只有一条语句,使用<jsp:forward>标签转发到/jsps/main.jsp。而main.jsp页面是框架页,分为上、左、高级、中三个部分。分别对应:top.jsp、left.jsp、gj.jsp、body.jsp。

其中book、cart、order、user目录中分别对应各自模块的页面;pager是分页页面,使用分页的页面会使用<%@include>指令包含分页页面。

js和css目录下又分为book、cart、order、user目录:

 

 

  对应不同页面的css和js文件。

 

7 添加过滤器

添加编码过滤器!

web.xml

<filter>

    <filter-name>EncdoingFilter</filter-name>

    <filter-class>cn.itcast.filter.EncodingFilter</filter-class>

</filter>

<filter-mapping>

    <filter-name>EncdoingFilter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>


 [q1]这个的内容会在当前页面被加载完成后执行,相同与<body>的onload事件。

 [q2]给id为btn的元素添加click事件

 [q3]发送异步请求

 [q4]请求方式为POST

 [q5]服务器返回的数据类型为json类型

 [q6]请求的url为/AjaxServlet

 [q7]请求参数有两个,分别为method=findByName以及name=name

 [q8]当请求成功后,会执行这个方法,其中参数person是由服务器返回的json对象。

 [q9]因为请求服务器时指定method参数值为findByName,所以就会调用本方法

 [q10]获取name参数值

 [q11]把Person对象转换成json对象

 [q12] 发送给客户端

 

 

 

未完待续...................

以上是关于图书管理项目的主要内容,如果未能解决你的问题,请参考以下文章

Java小项目迷你图书管理系统

学习SpringBoot+jsp图书管理系统项目,源码

学习SpringBoot+jsp图书管理系统项目,源码

项目实战 图书信息管理系统(Maven,mybatis)(第一个自己独立完成的项目)

Java swing项目-图书管理系统(swing+mysql+jdbc)

部署图书管理系统项目