首页 > 其他分享 >图书商城后台功能实现

图书商城后台功能实现

时间:2023-05-26 10:44:07浏览次数:23  
标签:分类 adminjsps 表单 jsp 商城 后台 图书 页面

后台功能实现

1 后台管理介绍

1.1 后台页面

后台页面都在adminjsps目录下:

 

1.2 后台功能模块介绍

后台功能模块分为:

l 管理员模块:

  • 管理员登录;
  • 管理员退出;

l 分类管理模块:

  • 查看所有分类;
  • 添加一级分类;
  • 添加二级分类;
  • 编辑一级分类;
  • 编辑二级分类;
  • 删除一级分类;
  • 删除二级分类;

l 图书管理模块:

  • 查看指定分类图书;
  • 查看指定条件图书;
  • 添加新图书;
  • 编辑图书;
  • 删除图书;

l 订单管理模块:

  • 查看所有订单;
  • 查看指定状态订单;
  • 查看订单详细信息;
  • 取消订单;
  • 订单发货。

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

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

2 后台管理员模块

后台管理员模块功能:

l 管理员登录;

l 管理员退出。

2.1 后台管理员相关类创建

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

Admin.java

public class Admin {

private String adminId;//ID

private String adminname;//管理员名

private String adminpwd;//管理员密码

}

 

2.2 管理员登录

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

l 把表单数据封装到Admin对象中;

l 使用表单数据调用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 分类管理

分类管理功能:

l 查看所有分类;

l 添加一级分类;

l 添加二级分类;

l 编辑一级分类;

l 编辑二级分类;

l 删除一级分类;

l 删除二级分类;

3.1 分类管理相关类创建

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

l 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()方法:

l 封装表单数据到Category child对象中;

l 给child指定cid;

l 获取表单pid,创建Category parent,把pid设置给parent的cid;

l 把parent设置给child;

l 调用categoryService#add(Category)方法完成添加;

l 调用AdminCategoryServlet#findAll(),回到list.jsp。

3.5 修改一级分类

修改一级分类分为两步:

l 在list.jsp中点击某个一级分类上的“修改”,到达edit.jsp;

l 在 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 修改二级分类

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

l 在list.jsp中点击某个二级分类上的“修改”,到达edit2.jsp;

l 在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有两个链接:添加图书和高级搜索。

 

图书管理功能如下:

l 按分类查询图书;

l 按作者查询图书;

l 按出版社查询图书;

l 高级搜索(多条件组合查询);

l 查询图书详细;

l 添加图书;

l 编辑图书;

l 删除图书。

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

4.1 与前台相同功能实现

1. 左部显示所有分类

l 修改main.jsp中left框架,让其请求AdminCategoryServlet的findAllForBook()方法;

l 为AdminCategoryServlet类添加findAllForBook()方法,让其获取所有分类,然后转发到/adminjsps/admin/book/left.jsp页面;

l 在/adminjsps/admin/book/left.jsp页面中使用Javascript小工具(Q6Menu)显示所有分类。

 

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

l 点击Q6Menu上的2级分类,请求AdminBookServlet#findByCategory()方法;

l 该方法实现参照BookServlet#findByCategory()方法,但最终转发到/adminjsps/admin/book/list.jsp页面;

l 修改list.jsp,显示图书列表。

 

  1. 按作者、出版社查询

l 修改list.jsp上的链接,让其请求AdminBookServlet对应的方法;

l 参数BookServlet对应方法完成,最后转发到/adminjsps/admin/book/list.jsp页面;

 

  1. 高级搜索

l 修改gj.jsp上的表单,让其请求AdminBookServlet的findByCombination()方法;

l 该方法参照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页面:

l 两种显示book方式:一是非表单显示,二是表单显示;

l javascript:

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

AdminBookServlet#load()方法:

l 获取bid加载图书,保存到request中;

l 获取所有1级分类,保存到request中;

l 获取当前book所属1级分类下的所有2级分类,保存到request中;

l 转发到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 添加图书

添加图书分为两步:

l 点击body.jsp上的“添加图书”链接,到达add.jsp;

l 在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上点击“订单管理”查看所有订单。

 

  订单管理功能如下:

l 查看所有订单;

l 查看未付款订单;

l 查看未发货订单;

l 查看未确认收货订单;

l 查看交易成功订单;

l 查看已取消订单;

l 查看订单详细信息;

l 取消未付款订单;

l 订单发货。

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

5.1 与前台相同功能实现

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

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

l 修改top.jsp中“订单管理”链接,请求AdminOrderServlet#findAll()方法;

l AdminOrderServlet#findAll()àfindAll()OrderService#findAll()àOrderDao#findAll()方法都参照前台的“我的订单来完成”来完成。最后转发到/adminjsps/admin/order/list.jsp页面。

l 修改list.jsp页面,不同状态显示不同链接。

 

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

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

l 修改/adminjsps/admin/order/list.jsp上5个按状态查询的链接,请求AdminOrderServleet#findByStatus()方法,参数订单状态。最后转发到/adminjsps/admin/order/list.jsp页面。

  1. 查看订单详细信息

l 在list.jsp页面点击订单编号链接,或点击查看链接,请求AdminOrderServlet#load()方法,传递订单oid,以及oper=desc。

l load()方法加载订单,保存到request中,把oper也保存到request中,转发到desc.jsp页面。

l desc.jsp页面显示订单信息,并根据oper显示按钮。

5.2 取消订单和订单发货

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

l 修改desc.jsp页面中“取消订单”和“发货”两个链接,请求AdminOrderServlet的cancel()和deliver()方法;

l 调用orderService.updateStatus(String oid, int status)方法完成对订单状态的修改;

l 保存成功信息到request中,转发到msg.jsp页面显示!

 

6 登录过滤器

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

l 页面:/adminjsps/admin/*;

l Servlet:/admin/*;

 

 

 

标签:分类,adminjsps,表单,jsp,商城,后台,图书,页面
From: https://www.cnblogs.com/LiuZhongquan/p/17434118.html

相关文章

  • 谷粒商城--三级分类
    谷粒商城--三级分类一、树形数据返回1、递归查询树形结构商品信息查询的实体类,要实现树形,实体类需要有pId(父id),nId(子id)加上忽略字段children(子类集合)。publicclassCategoryEntityimplementsSerializable{ privatestaticfinallongserialVersionUID=1L; /** *分......
  • 图书商城前台功能实现
    前台功能实现1用户模块用户模块功能包括:注册、激活、登录、退出、修改密码。1.1创建用户模块相关类在每个模块开始时,都要创建如下基本类:实体类、DAO类、Service类、Servlet类: 1.1.1 UserUser类作为实体类需要与数据库表对应,即t_user表对象。而且User类还要用......
  • 商城项目搭建
    项目搭建1.前台需求分析前台是针对用户购书,而后台是管理员管理系统。1.1前台主页  /index.jsp使用<jsp:forward>转发到/jsps/main.jsp,、main.jsp中只有一个<table>,结构如下(1)图书商城用户名:张三我的购物车 我的订单 修改密码 退出(2)图书分类......
  • 前端处理后台返回的流数据
    1、接口请求的时候一定要加responseType:'blob',否则生产的文件会是空白(PDF)2、代码实现constbinaryData=[]binaryData.push(res)//res后台返回的流数据this.pdfUrl=window.URL.createObjectURL(newBlob(binaryData,{type:'application/pdf'}))......
  • bat 后台运行
    1、第一种解决办法在你写的批处理文件,开头加上以下三行代码即可:if"%1"=="hide"gotoCmdBeginstartmshtavbscript:createobject("wscript.shell").run("""%~0""hide",0)(window.close)&&exit:CmdBegin2、第二种解决办法比如你的批处理文件,名字为......
  • Fdog系列(二):html写完注册页面之后怎么办,用java写后台响应呀。
    文章目录1.前言2.创建javaweb项目3.创建Server4.解决中文乱码问题5.响应后台数据目录Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。所有文章源码已整体打包上传至github,求星星!1.前言接着第一篇用html完成了注册页面,第二篇,我们来完成后台数据处理,需要用......
  • screen命令后台运行python 脚本
    1、安装screenyuminstall-yscreen2、新建一个screenscreen-Sxiedi这样会新开一个窗口,然后执行命令即可pythonmanage.pyrunserver0.0.0.0:90003、重开一个窗口,列出所有screen进程,如下\[root@docker~\]\#screen-lsTherearescreenson:3029.xiedi(Attached......
  • 报错问题:谷粒商城关于pubsub、publish报错,无法发送查询品牌信息的请求
    1、npminstall--savepubsub-js2、在src下的main.js中引用:①importPubSubfrom'pubsub-js'②Vue.prototype.PubSub=PubSub ......
  • C/C++图书信息管理系统[2023-05-25]
    C/C++图书信息管理系统[2023-05-25]图书信息管理系统主要内容:整个图书管理系统采用结构体作为基本数据结构,最终数据一定要保存到数据文件中。主函数通过switch语句来根据用户的需求跳转到各个模块,以实现用户的需要。系统要求能进行图书信息的浏览、添加、查询、修改、删除......
  • 直播商城系统源码,BottomSheetDialog实现-底部滑动栏
    直播商城系统源码,BottomSheetDialog实现-底部滑动栏bottom_popwindoow.xml中的代码 <?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"......