【JavaWeb】网上蛋糕商城后台-订单管理

概念

前面通过多篇文章以完全实现了用户在网上蛋糕商城平台上的所有功能和操作,从本文开始,实现网站的后台管理功能的介绍和操作。

订单列表

想要进入后台管理系统,则登入的用户一定是管理员账号,这个账号和密码只有管理员才知道,因此不用担心顾客会登录后台管理系统。我们在数据库中已存储一个管理员账号和密码,可以进行使用。当通过管理员账号和密码登录成功后,head.jsp头部页面中会出现后台管理选项。

点击“后台管理”进入到后台管理系统首页

因此需要在web文件夹下创建admin文件夹,并在该文件夹下创建index.jsp页面,并且放入需要关联的js,css以及图片资源等等。

并且还需要单独创建分离出来的后台管理的头部页面

head.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<nav class="navbar navbar-default" role="navigation">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="index.jsp">蛋糕店后台</a>
        </div>
        <div>
            <ul class="nav navbar-nav">
                <li ><a href="/admin/order_list">订单管理</a></li>
                <li ><a href="/admin/user_list">客户管理</a></li>
                <li ><a href="/admin/goods_list">商品管理</a></li>
                <li ><a href="/admin/type_list">类目管理</a></li>
                <li><a href="/user_logout">退出</a></li>
            </ul>
        </div>
    </div>
</nav>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>
<html>
<head>
<title>后台管理</title>
<link rel="stylesheet" href="css/bootstrap.css"/> 
</head>
<body>
<div class="container-fluid">
<jsp:include page="header.jsp"></jsp:include>
   <br><br>
   <div class="alert alert-success" role="alert">恭喜你! 登录成功了</div>
</div> 
</body>
</html>

点击“订单管理”,向服务器发送请求,获取所有订单信息

因此需要在servlet包中创建AdminOrderListServlet类

package servlet;

import model.Page;
import service.OrderService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "admin_order_list",urlPatterns = "/admin/order_list")
public class AdminOrderListServlet extends HttpServlet {
    private OrderService oService = new OrderService();
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int status = 0;
        if(request.getParameter("status") != null) {
            status=Integer.parseInt(request.getParameter("status") ) ;
        }
        request.setAttribute("status", status);
        int pageNumber = 1;
        if(request.getParameter("pageNumber") != null) {
            try {
                pageNumber=Integer.parseInt(request.getParameter("pageNumber") ) ;
            }
            catch (Exception e)
            {

            }
        }
        if(pageNumber<=0)
            pageNumber=1;
        Page p = oService.getOrderPage(status,pageNumber);
        if(p.getTotalPage()==0)
        {
            p.setTotalPage(1);
            p.setPageNumber(1);
        }
        else {
            if(pageNumber>=p.getTotalPage()+1)
            {
                p = oService.getOrderPage(status,pageNumber);
            }
        }

        request.setAttribute("p", p);
        request.getRequestDispatcher("/admin/order_list.jsp").forward(request, response);
    }
}

以上代码中,接收浏览器的请求后,判断用户是否传递状态参数,如果没有传递,则默认查询所有订单,如果有传递状态参数,根据状态参数来查询“已付款”,“未付款”,“配送中”,“已完成”等不同状态的订单,接着需要获得用户是否传递页码,如果没有默认为查询第一页的订单,并将状态参数和页码参数作为条件传递给订单业务逻辑层执行操作。

public Page getOrderPage(int status,int pageNumber) {
    Page p = new Page();
    p.setPageNumber(pageNumber);
    int pageSize = 10;
    int totalCount = 0;
    try {
        totalCount = oDao.getOrderCount(status);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    p.SetPageSizeAndTotalCount(pageSize, totalCount);
    List list=null;
    try {
        list = oDao.selectOrderList(status, pageNumber, pageSize);
        for(Order o :(List<Order>)list) {
            List<OrderItem> l = oDao.selectAllItem(o.getId());
            o.setItemList(l);
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    p.setList(list);
    return p;
}

以上代码中,根据状态查询当前状态下的订单总数,接着根据状态,页码以及记录数作为条件查询订单信息

因此需要在OrderDao类中定义对应的执行方法

public int getOrderCount(int status) throws SQLException {
    QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
    String sql = "";
    if(status==0) {
        sql = "select count(*) from `order`";
        return r.query(sql, new ScalarHandler<Long>()).intValue();
    }else {
        sql = "select count(*) from `order` where status=?";
        return r.query(sql, new ScalarHandler<Long>(),status).intValue();
    }
}
public List<Order> selectOrderList(int status, int pageNumber, int pageSize) throws SQLException {
    QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
    if(status==0) {
        String sql = "select o.id,o.total,o.amount,o.status,o.paytype,o.name,o.phone,o.address,o.datetime,u.username from `order` o,user u where o.user_id=u.id order by o.datetime desc limit ?,?";
        return r.query(sql, new BeanListHandler<Order>(Order.class), (pageNumber-1)*pageSize,pageSize );
    }else {
        String sql = "select o.id,o.total,o.amount,o.status,o.paytype,o.name,o.phone,o.address,o.datetime,u.username from `order` o,user u where o.user_id=u.id and o.status=? order by o.datetime desc limit ?,?";
        return r.query(sql, new BeanListHandler<Order>(Order.class),status, (pageNumber-1)*pageSize,pageSize );
    }
}

最后将查询的信息发送给admin的order_list.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>订单列表</title>
<link rel="stylesheet" href="css/bootstrap.css"/> 
</head>
<body>
<div class="container-fluid">
<jsp:include page="header.jsp"></jsp:include>
   <br>
   <ul role="tablist" class="nav nav-tabs">
      <li <c:if test="${status==0 }">class="active"</c:if> role="presentation"><a href="/admin/order_list">全部订单</a></li>
      <li <c:if test="${status==1 }">class="active"</c:if> role="presentation"><a href="/admin/order_list?status=1">未付款</a></li>
      <li <c:if test="${status==2 }">class="active"</c:if> role="presentation"><a href="/admin/order_list?status=2">已付款</a></li>
      <li <c:if test="${status==3 }">class="active"</c:if> role="presentation"><a href="/admin/order_list?status=3">配送中</a></li>
      <li <c:if test="${status==4 }">class="active"</c:if> role="presentation"><a href="/admin/order_list?status=4">已完成</a></li>
   </ul>
   <br>
   <table class="table table-bordered table-hover">
   <tr>
      <th width="5%">ID</th>
      <th width="5%">总价</th>
      <th width="15%">商品详情</th>
      <th width="20%">收货信息</th>
      <th width="10%">订单状态</th>
      <th width="10%">支付方式</th>
      <th width="10%">下单用户</th>
      <th width="10%">下单时间</th>
      <th width="10%">操作</th>
   </tr>
      <c:forEach items="${p.list }" var="order">
         <tr>
            <td><p>${order.id }</p></td>
            <td><p>${order.total }</p></td>
            <td>
               <c:forEach items="${order.itemList }" var="item">
                  <p>${item.goodsName }(${item.price }) x ${item.amount}</p>
               </c:forEach>
            </td>
            <td>
               <p>${order.name }</p>
               <p>${order.phone }</p>
               <p>${order.address }</p>
            </td>
            <td>
               <p>
                  <c:if test="${order.status==2 }"><span style="color:red;">已付款</span></c:if>
                  <c:if test="${order.status==3 }"><span style="color:green;">已发货</span></c:if>
                  <c:if test="${order.status==4 }"><span style="color:black;">已完成</span></c:if>

               </p>
            </td>
            <td>
               <p>

                  <c:if test="${order.paytype==1 }">微信</c:if>
                  <c:if test="${order.paytype==2 }">支付宝</c:if>
                  <c:if test="${order.paytype==3 }">货到付款</c:if>

               </p>
            </td>
            <td><p>${order.user.username }</p></td>
            <td><p>${order.datetime }</p></td>
            <td>
               <c:if test="${order.status==2 }">
                  <a class="btn btn-success" href="/admin/order_status?id=${order.id }&status=3">发货</a>
               </c:if>
               <c:if test="${order.status==3 }">
                  <a class="btn btn-warning" href="/admin/order_status?id=${order.id }&status=4">完成</a>
               </c:if>
               <a class="btn btn-danger" href="/admin/order_delete?id=${order.id }&pageNumber=${p.pageNumber}&status=${status}">删除</a>
            </td>
         </tr>
      </c:forEach>
</table>
<br>
   <jsp:include page="/page.jsp">
      <jsp:param value="/admin/order_list" name="url"/>
      <jsp:param value="&status=${status}" name="param"/>
   </jsp:include>
<br>
</div>
</body>
</html>

当点击发货按钮时,想服务器发送请求

因此在servlet包中创建AdminOrderStatusServlet类

package servlet;

import service.OrderService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "admin_order_status",urlPatterns = "/admin/order_status")
public class AdminOrderStatusServlet extends HttpServlet {
    private OrderService oService = new OrderService();

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        int status = Integer.parseInt(request.getParameter("status"));
        oService.updateStatus(id, status);
        response.sendRedirect("/admin/order_list?status="+status);
    }
}

以上代码中,接收到浏览器的请求,并接收订单编号以及状态参数作为执行条件发送给业务逻辑

public void updateStatus(int id,int status) {
    try {
        oDao.updateStatus(id, status);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

该方法将两个参数传递给dao层的OrderDao类执行

public void updateStatus(int id,int status) throws SQLException {
    QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
    String sql ="update `order` set status=? where id = ?";
    r.update(sql,status,id);
}

当状态更新成功后,则刷新订单管理页面。并且跳转至配送中状态

当点击“完成”按钮时,向服务器的AdminOrderStatusServlet类发送请求,修改状态即可。

 

删除订单

在订单管理功能中,不管处于任何状态,只要管理员点击删除按钮,则向服务器发出请求,执行删除当前订单操作。

因此需要在servlet包中创建AdminOrderDeleteServlet类完成删除订单操作

package servlet;

import service.OrderService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "admin_order_delete",urlPatterns = "/admin/order_delete")
public class AdminOrderDeleteServlet extends HttpServlet {
    private OrderService oService = new OrderService();

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));

        oService.delete(id);
        request.getRequestDispatcher("/admin/order_list").forward(request, response);
    }
}

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

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

相关文章

图搜索算法 - 拓扑排序

相关文章&#xff1a; 数据结构–图的概念 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 图搜索算法 - 广度优先搜索法&#xff08;BFS&#xff09; 拓扑排序 概念 几乎所有的工程都可分为若干个称作活动的子工程&#xff0c;而这些子工程之间&#xff0c;通常受…

多个开源的js补环境框架测试

原文链接&#xff1a;https://mp.weixin.qq.com/s/uEMFGpE5bqmTvzSgX2twvA 前言 在做js逆向时肯定会遇到补环境的情况&#xff0c;看到github开源了好几个补环境用的框架&#xff0c;这篇文章做个测试&#xff0c;看看哪个比较好用。 https://github.com/pysunday/sdenvhttp…

使用Tkinter实现数据预测工具的GUI界面展示

如果构建好预测模型后&#xff0c;想将预测模型通过一个交互式的页面显示&#xff0c;可以通过下边两种方式实现。 本文中代码有详细解析注释&#xff0c;便不再如往期一样分开讲解了&#xff0c;有需要的朋友可以直接拿去使用&#xff0c;代码可以直接运行&#xff0c;把预测…

【计算机网络原理】初始网络原理和一些名词解释​​

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

【读点论文】SAM-LIGHTENING: A LIGHTWEIGHT SEGMENT ANYTHING MODEL,改进自注意力机制,然后知识蒸馏提点

SAM-LIGHTENING: A LIGHTWEIGHT SEGMENT ANYTHING MODEL WITH DILATED FLASH ATTENTION TO ACHIEVE 30 ACCELERATION ABSTRACT 分割任意模型&#xff08;SAM&#xff09;由于其零样本泛化能力&#xff0c;在分割任务中引起了广泛的关注。然而&#xff0c;SAM在现实世界实践中…

一个圈圈的机制玩法

什么是一个圈圈&#xff0c;说白了就是一个撸广告的平台&#xff0c;只是引入了减产机制&#xff0c;九维机制和分成机制&#xff0c;再加上有央企背景&#xff0c;做的一个区块链平台。 玩法很简单&#xff0c;就是撸广告获取能量&#xff0c;然后获取绿色能量&#xff0c;等…

网络安全之ACL

ACL&#xff1a;访问控制列表——控制列表&#xff08;策略列表&#xff09;&#xff0c;是一个控制工具。 功能&#xff1a;&#xff01;、定义感兴趣路由&#xff08;控制层面&#xff09;。2、定义感兴趣流量&#xff08;数据层面&#xff09;。 例如&#xff1a; 假设在该…

记一次favicon.ico的折腾

某项目需要将前端和后台整合在一起 我也不知道为啥要整合 上面有要求就整呗 正常前端npm run build打包后 dist内会根据设置自动生成favicon.ico文件在根目录下 但由于前后端整合 需要打包后将图标放在dist下的static文件夹里 需要的效果 打包后 index.html里 <link rel&…

vscode与git下载安装

粉丝不过W git下载地址: https://git-scm.com/downloads, 安装git时, 记住你安装Git的路径 vscode下载地址: https://code.visualstudio.com/ 下载完后, 并默认安装好, 你就可以进入配置git的环境变量了, 点击win, 点击设置 在搜索框里搜索, 高级系统设置 点到 高级 , 然后点击…

智慧公厕:数据驱动的新时代公共厕所管理

公共厕所是城市的重要基础设施&#xff0c;直接关系到人民群众的生活质量和城市形象。然而&#xff0c;长期以来&#xff0c;公共厕所的管理问题一直困扰着城市管理者。为了解决这个难题&#xff0c;智慧公厕应运而生。本文将以智慧公厕源头实力厂家广州中期科技有限公司&#…

500的项目研发成本2000?

上个月接了一个小程序的二开项目&#xff0c;功能不多就2个诉求&#xff1a;调整首页数据排序规则&#xff0c;帖子详情增加一个海报&#xff0c;报了一个我认为还比较合适的价格500。 当我拿到代码的那一刻有点小害怕&#xff0c;因为这个客户的之前合作过一次&#xff0c;项…

淘宝订单详情与物流电子面单API接口:提升电商物流效率的利器

前言 在电子商务蓬勃发展的今天&#xff0c;物流作为电商交易的重要环节&#xff0c;其效率和准确性直接关系到消费者的购物体验和商家的运营效率。淘宝作为中国最大的电商平台之一&#xff0c;一直致力于提升物流效率和服务质量。其中&#xff0c;淘宝订单详情与物流电子面单A…

开发中的一些专业术语,POJO、PO...

在 Java 开发中&#xff0c;以下是常见的设计模式和概念&#xff1a; PO&#xff08;Persistent Object&#xff09;&#xff1a;持久化对象&#xff0c;也称为实体类或数据对象。它是与数据库表结构对应的类&#xff0c;通常用于表示持久化数据的实体。PO 类的属性与数据库表的…

重生奇迹MU获取宝石方法

1、商城&#xff1a;商场分为钻石商城和绑钻商城&#xff0c;钻石是直接充值的&#xff0c;绑钻是系统赠送的&#xff0c;两个地方所出售的道具都不一样&#xff0c;绑钻不能在钻石商城中购买。钻石商城中有各个等级的宝石出售&#xff0c;越高级的钻石越贵&#xff0c;不建议平…

[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位

键盘改造 &#x1f94b; 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd>p</kbd> 粘贴剪贴板中的内容 <kbd>i</kbd> 切换到 插入模式 <kbd>h</kbd>…

网络技术-链路层可靠传输协议

可靠传输 在链路层传输中&#xff0c;可能出现的错误包括数据位出错、分组丢失、分组失序、分组重复等。可靠传输服务希望实现发送端发送什么&#xff0c;接收端就接收到什么。虽然下面将在链路层这一章节中介绍SW、GBN、SR三种协议&#xff0c;但要明确的是&#xff0c;可靠传…

typescript 模块化

模块的概念&#xff1a; 把一些公共的功能单独抽离成一个文件作为一个模块。 模块里面的变量、函数、类等默认是私有的&#xff0c;如果我们要在外部访问模块里面的数据&#xff08;变量、函数、类&#xff09;&#xff0c;需要通过export暴露模块里面的数据&#xff08;&#…

深度解读《深度探索C++对象模型》之C++的临时对象(二)

目录 临时对象的生命期 特殊的情况 接下来我将持续更新“深度解读《深度探索C对象模型》”系列&#xff0c;敬请期待&#xff0c;欢迎左下角点击关注&#xff01;也可以关注公众号&#xff1a;iShare爱分享&#xff0c;或文章末尾扫描二维码&#xff0c;自动获得推文和全部的…

51单片机keil编程中遇到的问题(持续更新)

字符无法打印报错 查看特殊功能寄存器名字的时候也会报错&#xff0c;因为无法编译通过&#xff0c;导致头文件的定义内容无法查找 keil编译中 error C127: ‘xx’: invalid storage class 这种一般是在编写头文件或源文件时&#xff0c;在声明函数的结尾没有添加分号&…

C++——list和string

list与string 前言一、listlist.hList的节点类List的迭代器类list类list.h 完整实现 list.cppList的节点类List的迭代器类list类list.cpp 完整实现 二、stringstring.hstring.cpp 总结 前言 C容器的学习开始啦&#xff01; 大家先来学习list&#xff01; 紧接着string和vector…
最新文章