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

news2024/11/26 13:52:23

概念

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

订单列表

想要进入后台管理系统,则登入的用户一定是管理员账号,这个账号和密码只有管理员才知道,因此不用担心顾客会登录后台管理系统。我们在数据库中已存储一个管理员账号和密码,可以进行使用。当通过管理员账号和密码登录成功后,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.coloradmin.cn/o/1652177.html

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

相关文章

Isaac Sim 3(学习笔记5.8)

Isaac Sim 利用深度学习获取mask掩码图 参考内容 Kubernetes官网 在 Linux 系统中安装并设置 kubectl | Kubernetes准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如&#xff1a;v1.30 版本的客户端能与 v1.29、 v1.30 和 v1.31 版本的控制面通信。 用…

WPF之多种视图切换

1&#xff0c;View切换&#xff0c;效果呈现 视图1 视图2 视图3 2&#xff0c;在Xaml中添加Listview控件&#xff0c;Combobox控件。 <Grid ><Grid.RowDefinitions><RowDefinition Height"143*"/><RowDefinition Height"30"/>&l…

五款加密软件的对比分析|加密软件怎么选

从企业防泄密角度来说&#xff0c;加密软件是最有效的解决方案之一&#xff0c;通过对内部核心文档、图纸、代码、视频等各类文件进行加密。可以有效防止文件外发泄密、窃取、设备丢失导致的数据泄露。 下面主要对五款加密软件进行对比分析&#xff0c;帮助你快速选择一个适合…

gpt_academic的使用——含一键安装和接入其他API以及本地模型

https://github.com/binary-husky/gpt_academic/releases/ https://github.com/binary-husky/gpt_academic/wiki 安装

数据结构复习指导之二叉树

文章目录 二叉树 考纲内容 复习提示 1.二叉树的概念 1.1二叉树的定义及其主要特性 1.1.1二叉树的定义 1.1.2几种特殊的二叉树 1.1.3二叉树的性质 1.2二叉树的存储结构 1.2.1顺序存储结构 1.2.2链式存储结构 知识回顾 二叉树 考纲内容 &#xff08;一&#xff09;树…

Hive数据模型

Hive数据模型 1. 表&#xff08;Table&#xff09;&#xff1a; 表是数据库中的基本组成单位&#xff0c;用于存储数据。它由一系列的行和列组成&#xff0c;每行代表一个记录&#xff0c;每列代表一种属性或字段。创建表时&#xff0c;你需要定义列的数据类型、约束和索引等信…

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

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

Windows端之Python3.9及以上高版本工程打包得到的exe逆向工程解包得到pyc文件进而得到py文件的流程实现

参考来自 【python逆向 pyc反编译】python逆向全版本通杀_python反编译pyc-CSDN博客https://blog.csdn.net/zjjcxy_long/article/details/127346296Pyinstaller打包的exe之一键反编译py脚本与防反编译_pyinstaller防止反编译-CSDN博客https://blog.csdn.net/as604049322/artic…

Java零拷贝技术实战

文章目录 引入传统IO内存映射mmap文件描述符sendFile测试总结 引入 为什么要使用零拷贝技术&#xff1f; 传统写入数据需要4次拷贝&#xff0c;如下图&#xff1a; 传统IO import java.io.*; import java.net.Socket;public class TranditionIOClient {private static fina…

​「Python绘图」绘制太极图

python 绘制太极 一、预期结果 二、核心代码 import turtlepen turtle.Turtle()print("开始绘制太极")radius 100 pen.color("black", "black") pen.begin_fill() pen.circle(radius/2, 180) pen.circle(radius, 180) pen.left(180) pen.circ…

小项目“谈笑风生”测试报告

文章目录 一、项目介绍1.1项目背景1.2功能介绍 二、测试环境三、测试执行过程3.1功能测试3.1.1登录页面测试3.1.2注册页面测试3.1.3主页面测试 3.2界面自动化测试3.2.1登录模块测试3.2.2注册模块测试3.2.3展示各种信息模块测试3.2.34聊天消息传送模块测试 四、测试结论与建议 一…

8.Redis

Redis是一个基于内存的key-value结构数据库&#xff0c;而mysql是通过数据文件&#xff0c;以二维表的方式存储在磁盘上。 优点 基于内存存储&#xff0c;读写性能高适合存储热点数据企业应用广泛 Redis目录文件 启动命令 redis-server.exe redis.windows.conf 退出命令 c…

☺☺☺☺☺☺☺栈的应用习题:有效的括号☺☺☺☺☺☺☺

目录 一解题思路&#xff1a; 二对解答代码分析&#xff1a; 三解答代码展示&#xff1a; 即浅学栈的创建后&#xff0c;可以简单利用其性质&#xff08;先进后出&#xff0c;后进先出&#xff09;来完成对一些题目的解答 如&#xff1a; 一解题思路&#xff1a; 这里我们可…

图数据库 之 Neo4j 与 AI 大模型的结合绘制知识图谱

引言 随着信息时代的到来&#xff0c;海量的文本数据成为了我们获取知识的重要来源。然而&#xff0c;如何从这些文本数据中提取出有用的信息&#xff0c;并将其以可视化的方式展示出来&#xff0c;一直是一个具有挑战性的问题。近年来&#xff0c;随着人工智能技术的发展&…

2024年开抖音小店需要多少钱?你真的知道吗?最新入驻条件及费用

大家好&#xff0c;我是电商花花。 现在仍然有很多想开抖店&#xff0c;想做抖音小店&#xff0c;但是很多人都不知道投资一家抖音小店需要多少钱&#xff0c;今天花花就给大家讲一下做一家抖音小店需要投入多少资金&#xff0c;以及具体投入到哪些方面。 我们就说一下个体店…

layui 数据表格 自动定位新增行位置

由于数据表格新增行后没有到新增到当前位置 继续增加的需求&#xff1a; 因为自己是新增行后到最后一行的 所以 就定位到最后一行 并且 高亮 高亮颜色浅 可自行更改 整理了一下 可根据 情况 修改 // 初始化滚动条位置变量 let tableScroll {scrollTob: 0,scrollLeft: 0,…

Shuffle Cards (STL rope平衡树库)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例1&#xff1a; 输入 5 1 2 3 输出 2 3 4 1 5 样例2&#xff1a; 输入 5 2 2 3 2 3 输出 3 4 1 2 5 样例3&#xff1a; 输入 5 3 2 3 1 4 2 4输出 3 4 1 5 2 思路&#xff1a; 这道题&…

windows端口复用

1. 概述 使用 HTTP.sys 中的 Net.tcp Port Sharing 服务&#xff0c;配合 WinRM 实现端口复用。 优点&#xff1a; HTTP.sys 为 windows 原生机制&#xff0c; WinRM 为 windows 自带功能&#xff0c;动作较小&#xff0c;不易触发主 动防御。 需要管理员权限。 2. 原理 (…

STM32 VS Code 扩展用户指南

系列文章目录 前言 一、视频教程快速入门 通过我们简单易学的视频教程&#xff0c;快速掌握新版本的使用方法&#xff1a; 二、功能描述 2.1 创建/导入项目 STM32 VS Code 扩展提供两种不同的项目创建选项&#xff1a; STM32CubeMX 项目&#xff1a; 这是一个依靠 CMake 作为…

线下预约线下消费万能DIY小程序源码系统 带完整安装代码包

在数字化时代&#xff0c;线上线下融合的消费模式已成为新趋势。为满足广大商家对于个性化预约系统的需求&#xff0c;我们隆重推出了“线下预约线下消费万能DIY小程序源码系统”。该系统不仅具备完整的安装代码包&#xff0c;还提供了丰富的定制功能&#xff0c;助力商家轻松搭…