网上书店后台功能实现

后台功能实现

1 后台管理介绍

1.1 后台页面

后台页面都在adminjsps目录下:

1.2 后台功能模块介绍

后台功能模块分为:

  1. 管理员模块:
  • 管理员登录;
  • 管理员退出;
  1. 分类管理模块:
  • 查看所有分类;
  • 添加一级分类;
  • 添加二级分类;
  • 编辑一级分类;
  • 编辑二级分类;
  • 删除一级分类;
  • 删除二级分类;
  1. 图书管理模块:
  • 查看指定分类图书;
  • 查看指定条件图书;
  • 添加新图书;
  • 编辑图书;
  • 删除图书;
  1. 订单管理模块:
  • 查看所有订单;
  • 查看指定状态订单;
  • 查看订单详细信息;
  • 取消订单;
  • 订单发货。

其中只有管理员模块是前台没有的,其他三个模块前台都有。但是,尽管前台有这三个模块,前后台也不能共享Servlet!但前后台可以共享Service和DAO层!所以只有管理员模块需要创建所有层的类,而其他三个模块只需要创建Servlet层类即可。

  后台有很多功能与前台是相同的,例如按分类查看图书功能,只是转发的页面是后台页面而已,所以这里很多功能就不在赘述了。

2 后台管理员模块

后台管理员模块功能:

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

2.1 后台管理员相关类创建

  1. cn.itcast.goods.admin.admin.domain.Admin;
  2. cn.itcast.goods.user.admin.admin.dao.AdminDao;
  3. cn.itcast.goods.user.admin.admin.service.AdminService;
  4. cn.itcast.goods.user.admin.admin.web.servlet.AdminServlet。

Admin类对应t_admin表,不再废话,直接给出基本代码;

Admin.java

public class Admin {

private String adminId;//ID

private String adminname;//管理员名

private String adminpwd;//管理员密码

}

2.2 管理员登录

login.jsp是后台登录页面,页面本身提供了表单显示功能。提交表单请求AdminServlet#login()方法:

  1. 把表单数据封装到Admin对象中;
  2. 使用表单数据调用AdminService#login()方法查询用户;
  • 如果查询到用户说明登录成功:把查询到的用户保存到session中,转发到index.jsp;
  • 如果没有查询到,说明登录失败:在request中保存错误信息,转发到login.jsp。

  登录成功后转发到/adminjsps/admin/index.jsp页面,该页面top.jsp部分需要显示当前用户名,所以需要修改该页面。

2.3 管理员退出

top.jsp页面中存在“退出”链接,让该链接请求AdminServlet#quit()方法。quit()方法从session中移除当前用户,转发到login.jsp页面。

3 分类管理

分类管理功能:

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

3.1 分类管理相关类创建

Service和Dao与前台共享即可,无需再创建,而Servlet需要单独创建。

  1. cn.itcast.bookstore.admin.category.web.servlet.AdminCategoryServlet;

在web.xml中配置该类时,<url-partern>为/admin/AdminCategoryServlet,方法后面添加登录过滤器。不只是该模块的Servlet如此,图书和订单模块都是如此。

3.2 查看所有分类

在top.jsp页面点击“分类管理”链接完成查看所有分类。该链接请求AdminCategoryServlet#findAll()方法,得到所有分类,即List<Category>,然后保存到request中,转发到/adminjsps/admin/category/list.jsp页面显示。

CategoryService和CategoryDao都已经写好了,所以无需再写!

3.3 添加一级分类

从/adminjsps/admin/category/list.jsp中点击添加一级分类到达/adminjsps/admin/category/add.jsp页面。

在add.jsp页面提交表单,请求AdminCategoryServlet#addOneLevel()方法,完成添加分类。addOneLevel()在添加完成后,调用AdminCategoryServlet#findAll()方法,回到list.jsp显示所有分类。

3.4 添加二级分类

添加二级分类共两步:一是到达表单页面,二是提交表单完成添加。

  1. 到达表单页面

  在/adminjsps/admin/category/list.jsp中,在某个一级分类上点击“添加二级分类”,请求AdminCategoryServlet#addTwoLevelPre()方法,传递一级分类cid。addTwoLevelPre()会获取所有一级分类,以及当前一级分类cid,然后转发到/adminjsps/admin/category/add2.jsp页面。

在add2.jsp页面中显示所有一级分类,因为二级分类有父分类。

  1. 完成添加二级分类

在add2.jsp页面提交表单,完成添加二级分类。提交表单请求AdminCategoryServlet的addTwoLevel()方法:

  1. 封装表单数据到Category child对象中;
  2. 给child指定cid;
  3. 获取表单pid,创建Category parent,把pid设置给parent的cid;
  4. 把parent设置给child;
  5. 调用categoryService#add(Category)方法完成添加;
  6. 调用AdminCategoryServlet#findAll(),回到list.jsp。

3.5 修改一级分类

修改一级分类分为两步:

  1. 在list.jsp中点击某个一级分类上的“修改”,到达edit.jsp;
  2. 在 edit.jsp页面提交表单。
  1. 到达edit.jsp

在/adminjsps/admin/category/list.jsp页面上,点击某个一级分类上的“修改”链接,请求AdminCategoryServlete#editOneLevelPre()方法,传递cid。

editOneLevelPre()方法通过cid加载当前分类,保存到request中,转发到edit.jsp,在表单中显示。

  1. 提交表单完成修改一级分类

在edit.jsp页面提交表单,请求AdminCategoryServlet#editOneLevel()方法,传递表单数据,其中表单中需要添加隐藏字段cid,即被修改的分类id。

editOneLevel()调用service完成修改后,返回到list.jsp。

3.6 修改二级分类

修改二级分类也是分为两步:

  1. 在list.jsp中点击某个二级分类上的“修改”,到达edit2.jsp;
  2. 在edit2.jsp页面提交表单。
  1. 到达edit2.jsp

在/adminjsps/admin/category/list.jsp页面上,点击某个二级分类上的“修改”链接,请求AdminCategoryServlet#editTwoLevelPre()方法,传递cid。

editTwoLevelPre()方法通过cid加载当前分类,保存到request中,再加载所有一级分类保存到request中。转发到/adminjsps/admin/category/edit2.jsp页面。

edit2.jsp在表单中显示当前二级Category对象,而且还要把所有一级分类显示到下拉列表中。然后让下拉列表上显示当前Category的父分类。

  1. 在edit2.jsp提交表单,完成修改

在/adminjsps/admin/edit2.jsp页面上提交表单,请求AdminCategoryServlet#editTwoLevel()方法,传递表单数据,还有添加隐藏字段cid,即要修改的分类cid。

editTowLevel()方法获取表单数据,封装到Category child对象中,再获取pid,创建Category parent,把pid设置给parent,再把parent设置给child,然后调用categoryService的edit(Category)方法完成修改。最后回到list.jsp显示。

3.7 删除一级分类

在/adminjsps/admin/category/list.jsp页面上,点击某个一级分类上的“删除”链接完成删除。点击链接请求AdminCategoryServlet#deleteOneLevel()方法,传递当前一级分类的cid。

deleteOneLevel()方法首先获取cid,然后调用CategoryService的deleteOneLevel()方法完成删除,转发到list.jsp显示。注意,CategoryService#deleteOneLevel()方法可能会抛出CategoryService异常,如果抛出了异常,那么Servlet会把异常信息保存到request中,转发到/adminjsps/msg.jsp页面显示。

CategoryService#deleteOneLevel()方法会先判断该1 级分类下是否存在子分类,如果存在那么它会抛出CategoryService异常;如果不存在,那么删除该分类。

3.8 删除二级分类

在/adminjsps/admin/category/list.jsp页面上,点击某个二级分类上的“删除”链接完成删除。点击链接会请求ActionCategoryServlet#deleteTwoLevel()方法,传递当前二级分类的cid。

deleteTwoLevel()方法首先获取cid,然后调用CategoryService的deleteTwoLevel()方法完成删除,转发到list.jsp显示。注意,CategoryService#deleteTwoLevel()方法可能会抛出CategoryException异常,如果抛出了异常,那么Servlet会把异常信息保存到request中,转发到/adminjsps/msg.jsp页面显示。

CategoryService#deleteTowLevel()方法会先判断该2级分类下是否存在图书,如果存在那么抛出CategoryException异常;如果不存在,那么删除该分类。

4 图书管理

在top.jsp上点击“图书管理”进入图书管理主页:/adminjsps/admin/book/main.jsp,main.jsp是框架页,分为左部和中部,其中左部为所有分类(与前台主页左部相同),中部默认显示body.jsp,body.jsp有两个链接:添加图书和高级搜索。

图书管理功能如下:

  1. 按分类查询图书;
  2. 按作者查询图书;
  3. 按出版社查询图书;
  4. 高级搜索(多条件组合查询);
  5. 查询图书详细;
  6. 添加图书;
  7. 编辑图书;
  8. 删除图书。

后台图书管理中有很多功能与前台一样,可参照前台完成。

4.1 与前台相同功能实现

1. 左部显示所有分类

  1. 修改main.jsp中left框架,让其请求AdminCategoryServlet的findAllForBook()方法;
  2. 为AdminCategoryServlet类添加findAllForBook()方法,让其获取所有分类,然后转发到/adminjsps/admin/book/left.jsp页面;
  3. 在/adminjsps/admin/book/left.jsp页面中使用Javascript小工具(Q6Menu)显示所有分类。

2. 按分类查询图书(分页显示)

  1. 点击Q6Menu上的2级分类,请求AdminBookServlet#findByCategory()方法;
  2. 该方法实现参照BookServlet#findByCategory()方法,但最终转发到/adminjsps/admin/book/list.jsp页面;
  3. 修改list.jsp,显示图书列表。

  1. 按作者、出版社查询
  1. 修改list.jsp上的链接,让其请求AdminBookServlet对应的方法;
  2. 参数BookServlet对应方法完成,最后转发到/adminjsps/admin/book/list.jsp页面;

  1. 高级搜索
  1. 修改gj.jsp上的表单,让其请求AdminBookServlet的findByCombination()方法;
  2. 该方法参照BookServlet实现,最后转发到/adminjsps/admin/book/list.jsp页面;

4.2 加载图书

在list.jsp上点击图书的图片、图书名,请求AdminBookServlet#load()方法,load()方法完成加载图书,转发到desc.jsp显示。

desc.jsp页面不仅可以显示图书详细信息,而且还可以作为编辑图书的表单。该页面上有一个“编辑或删除”复选框,如果勾选了它,那么desc.jsp页面上就显示表单,用来作为编辑图书而用;如果没有勾选desc.jsp只是显示图书详细信息。

因为desc.jsp不仅用来显示图书详细,而且还用来作为编辑图书的表单页面,默认desc.jsp页面使用非表单形式显示图书。

当desc.jsp要显示表单时,还要允许用户修改图书的分类,所以load()方法还要传递所有1 级分类,以及当前图书所有1 级分类下的所有2 级分类。并且,用户在修改了1 级分类后,页面还要向服务器发出异步请求,请求当前1 级分类下的所有2级分类,然后显示在下拉列表中。

desc.jsp页面:

  1. 两种显示book方式:一是非表单显示,二是表单显示;
  2. javascript:
  • 给“编辑或删除”复选框添加事件,未勾选时使用非表单显示;勾选时使用表单显示;
  • 给1级分类下拉列表添加onchange事件,异步请求当前1级分类下所有2级分类,然后显示在2 级分类下拉列表中。
  • 因为desc.jsp页面的表单有两个提交按钮(编辑和删除),所以需要为这两个提交按钮添加事件,为表单添加隐藏字段method的值,然后提交表单。

AdminBookServlet#load()方法:

  1. 获取bid加载图书,保存到request中;
  2. 获取所有1级分类,保存到request中;
  3. 获取当前book所属1级分类下的所有2级分类,保存到request中;
  4. 转发到desc.jsp。

load()

public String load(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/*

 * 1. 获取bid,通过bid加载book,保存到request中

 */

String bid = request.getParameter("bid");

Book book = bookService.load(bid);

request.setAttribute("book", book);

/*

 * 2. 获取所有1级分类,保存到request中

 */

request.setAttribute("parents", categoryService.findParents());

/*

 * 3. 获取当前图书所属1级分类下的所有2级分类

 */

// 获取当前图书所属1级分类cid

String pid = book.getCategory().getParent().getCid();

request.setAttribute("children", categoryService.findChildren(pid));

return "/adminjsps/admin/book/desc.jsp";

}

desc.jsp需要显示1级、2级分类的下拉列表。

<c:forEach items="${parents }" var="parent">

<option value="${parent.cid }" <c:if test="${book.category.parent.cid eq parent.cid }">selected="selected"</c:if>>${parent.cname }</option>

</c:forEach>

<c:forEach items="${children }" var="child">

<option value="${child.cid }" <c:if test="${book.category.cid eq child.cid }">selected="selected"</c:if>>${child.cname }</option>

</c:forEach>

desc.jsp需要添加异步请求,在1级分类修改后,请求新的1级分类下所有2级分类,并显示在2级分类的下拉列表中。

/*

给1级分类下拉列表添加改变事件

在重新选择了1级分类后,加载该1级分类的所有2级分类并显示在2级分类下拉列表中

*/

$("#pid").change(function() {

var pid = $(this).val();//获取新的1级分类id

$("#cid").empty();//清空2级分类下拉列表

// 添加头选项

$("#cid").append($("<option value=''>==请选择2级分类==</option>"));

if(pid) {//如果新的1级分类不为空!

$.ajax({

url:"<c:url value='/admin/AdminCategoryServlet'/>",

data:{method:"childrenForAjax", pid:pid},

dataType:"json",

type:"POST",

async:"false",

cache:"false",

success:function(children) {

// 循环遍历所有2级分类

for(var i = 0; i < children.length; i++) {

// 创建选项同

var option = $("<option>").attr("value", children[i].cid).text(children[i].cname);

// 向2级分类下拉列表中添加选项同

$("#cid").append(option);

}

}

});

}

4.3 编辑图书

在desc.jsp页面点击“编辑图书”按钮完成编辑图书,该链接请求AdminBookServlet的edit()方法。

edit()方法封装表单数据,调用BookService#edit(Book)方法完成编辑图书。然后保存“编辑成功”到request中,转发到/adminjsps/msg.jsp显示。

注意,编辑图书功能不支付编辑图书图片,所以在BookDao中的update语句不能修改image_b和image_w两列。

4.4 删除图书

在desc.jsp页面点击“删除图书”按钮完成删除图书,该链接请求AdminBookServlet的delete()方法。

delete()调用BookService#delete(bid)方法,完成删除图书。然后保存“删除成功”到request中,转发到/adminjsps/msg.jsp显示。

4.5 添加图书

添加图书分为两步:

  1. 点击body.jsp上的“添加图书”链接,到达add.jsp;
  2. 在add.jsp提交表单。
  1. 点击“添加图书”链接,到达add.jsp

点击“添加图书”链接,请求AdminBookServlet#addPre()方法,addPre()获取所有1级分类,然后转发到add.jsp页面。

add.jsp显示所有1级分类到下拉列表中,当用户显示1级后,需要发送异步请求,获取该1级分类下所有2级分类,然后显示到2级分类下拉列表中。(与编辑图书一样)

  1. 在add.jsp提交表单,完成添加图书。

添加图书需要上传图片,这一功能不能放到AdminBookServlet,而应该为其单独提供一个Servlet:AdminAddBookServlet。

在AdminAddBookServlet中需要使用commons-fileupload组件解析表单。获取所有表单项,封装到Book对象中,然后调用BookService#add(Book)方法完成添加,最终转发到msg.jsp显示成功信息。

注意,要对上传的图片扩展名进行校验!然后保存图片到book_img目录下!

5 订单管理

在top.jsp上点击“订单管理”查看所有订单。

  订单管理功能如下:

  1. 查看所有订单;
  2. 查看未付款订单;
  3. 查看未发货订单;
  4. 查看未确认收货订单;
  5. 查看交易成功订单;
  6. 查看已取消订单;
  7. 查看订单详细信息;
  8. 取消未付款订单;
  9. 订单发货。

后台订单功能与前台都是相同的,可参照前台完成。

5.1 与前台相同功能实现

1. 查看所有订单(分页显示)

这个功能前台没有,但与前台的“我的订单”很相似。

  1. 修改top.jsp中“订单管理”链接,请求AdminOrderServlet#findAll()方法;
  2. AdminOrderServlet#findAll()àfindAll()OrderService#findAll()àOrderDao#findAll()方法都参照前台的“我的订单来完成”来完成。最后转发到/adminjsps/admin/order/list.jsp页面。
  3. 修改list.jsp页面,不同状态显示不同链接。

2. 按状态查询订单(分页显示)

这个功能前台没有,但与前台的“我的订单”很相似。

  1. 修改/adminjsps/admin/order/list.jsp上5个按状态查询的链接,请求AdminOrderServleet#findByStatus()方法,参数订单状态。最后转发到/adminjsps/admin/order/list.jsp页面。
  1. 查看订单详细信息
  1. 在list.jsp页面点击订单编号链接,或点击查看链接,请求AdminOrderServlet#load()方法,传递订单oid,以及oper=desc。
  2. load()方法加载订单,保存到request中,把oper也保存到request中,转发到desc.jsp页面。
  3. desc.jsp页面显示订单信息,并根据oper显示按钮。

5.2 取消订单和订单发货

取消订单和订单发货都是修改订单状态的功能!

  1. 修改desc.jsp页面中“取消订单”和“发货”两个链接,请求AdminOrderServlet的cancel()和deliver()方法;
  2. 调用orderService.updateStatus(String oid, int status)方法完成对订单状态的修改;
  3. 保存成功信息到request中,转发到msg.jsp页面显示!

6 登录过滤器

添加后台管理员登录过滤器!

  1. 页面:/adminjsps/admin/*;
  2. Servlet:/admin/*;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本图书管理系统总体上分为前台页面显示和后台管理。 前台页面(即本书图书管理系统的首页)实现了公告的显示,图书查询,留言建议三大主要功能,有读者规则查看功能,师生们可以看到图书管理人员发布的最新公告信息,并可以查询自己感兴趣的图书,查看留言提议,用户登录后还有个人资料修改、个人借阅信息查询、个人违章信息查询等功能,也可以给学校的图书管理人员留言提议。 后台的页面则集成了图书管理中所需的功能,分成图书管理人员和系统管理人员,平时管理人员的工作都是在后台中完成的。前台是为了师生显示的。相对应的后台是针对学校图书管理人员,后台的页面都加密,如果不正常登录是进入不了后台管理页面的,后台图书管理人员功能包括:借阅图书、归还图书、借书记录显示与查找、还书记录显示与查找、公告增删改查;后台系统管理员功能包括:对书籍的增删改查、对书籍分类的增删改、对借阅证的增删改查、对借阅信息的显示与查找、对借阅规则的增删改、对图书管理员的增删改、对近期借阅书籍数量的折线图显示,以及对这些表格数据进行Excel表格的输出 共包含三个大模块:用户、图书管理员、系统管理员 一、用户模块 查看公告:能看到图书管理员发布的公告信息。 图书查看:分页显示,能看到图书总览,能通过图书编号、图书名称、作者、存放位置、图书描述进行模糊查询 个人违章信息(登录后):个人历史违章信息与查询 图书馆读者留言(登录后):对图书馆的建议,或对书籍的评价 查看借阅规则:不同的规则有不同的借阅限定数量、限定时间、超期费用 个人信息(登录后):对个人信息的查看与登录密码的修改 个人借阅信息(登录后):对个人借阅记录的分页查看与查询 二、图书管理员模块 借还图书:帮助用户借阅图书,并判断符不符合借阅规则、返还图书时判断有没有超期,超期则输出超期费用再归还 借阅报表:分页显示所有借阅记录、能进行查询和输出结果到excel公告管理:能添加编辑和删除公告 还书报表:分页显示所有未还的书籍,能通过借阅证号、图书编号、借阅日期、截止日期等条件进行模糊查询 个人信息修改:修改个人信息、密码等 三、系统管理员模块 书籍管理:分页,新添图书,设置图书各种信息,编辑删除,通过编号、书名、作者、描述等进行搜索,输出结果到excel,并且能查看该书籍被谁借阅过。 分类管理:分页显示,增删改书籍分类,书籍分类方便查阅整理 借阅证管理:分页显示所有借阅证,增删改查用户借阅证,查看该借阅证所有的借阅记录 借阅规则管理:能显示、编辑、删除所有借阅规则,借阅规则将决定该图书证能借阅什么图书馆的图书,能借多少本,能借多久以及超期每天的费用。 借阅信息查询:分页显示,能条件查询超期没还的,根据编号、借阅证号、书籍编号、借阅日期等进行模糊查询,输出结果到excel等,系统管理员只能查询,不能增删改借阅信息,这个操作由图书管理员操作。 图书管理员管理:对图书管理员进行增删改操作,但是不能修改原来的账号 图书借阅统计:通过折线图将图书馆近30天的每天借阅书籍数量直观的显示出来。 sql表 共有十张数据库表,书籍表、借书记录表、留言表、系统管理员表、借阅证表、图书管理管理员表书籍分类表、图书馆表、借阅规则表、公告表 书籍表 编号、姓名、作者、存放的图书馆、分类编号、存放位置、是否借出、书籍描述 借书记录表 编号、借阅证编号、书籍编号、借书日期、限制日期、归还日期、违规描述、处理人编号 留言表 编号、借阅证编号、留言内容、留言日期 系统管理员表 账号、密码 借阅证表 编号、密码、借阅者姓名、规则编号、状态(丢失、可用) 图书管理员表 编号、姓名、账号、密码、邮箱 书籍分类表 编号、分类名、分类描述 图书馆表 编号、图书馆名、描述 规则表 编号、限制借阅数量、限制借阅天数、图书超期每天费用 公告表 编号、标题、公告内容、发布日期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值