JavaWeb11(查看订单详情&优化结算)

简介: JavaWeb11(查看订单详情&优化结算)

一.效果预览

二. 实现思路

2.1 查看订单详情

①页面跳转  传参   前端传参

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE html>
<html lang="en">
<head>
   <title>查看订单详情</title>
    <!-- 支持手机端 -->
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <!-- 引入CSS -->
    <link rel="stylesheet" href="CSS/bootstrap.css" />
    <!-- 引入Bootstrap图标的样式 -->
    <link rel="stylesheet" href="font/bootstrap-icons.css" />
    <style>
        .navbar-collapse {
            /*1代表弹性扩大占用父容器剩余部分   0代表不占用*/
            flex-grow: 0;
        }
        .active {
              /*加粗*/
            font-weight: bold;
        }
        .text-right  button{
                width: 120px;/*宽度*/
                height: 30px;/*高度*/
                line-height: 10px;/*行高*/
                margin-top: 10px;/*上间距*/
        }
    </style>
</head>
<body>
    <!-- 订单详情 -->
    <div class="container" style="margin-top: 40px">
      <!--当订单为空时  -->
      <c:if test="${empty myorder}">
        <jsp:forward page="orders.do?index=6"></jsp:forward>
      </c:if>
      <!--当购物车集合不为空时  -->
      <c:if test="${not empty myorder}">
         <!--  text-center居中 -->
        <table style="margin-top: 20px;" class="table table-hover  text-center ">
            <!-- class="bg-primary" 加颜色 -->
            <thead class="bg-primary" style="color: aliceblue;">
                <tr>
                    <th scope="col">订单项编号</th>
                    <th scope="col">订单编号</th>
                    <th scope="col">商品名称</th>
                    <th scope="col">商品价格</th>
                    <th scope="col">商品图片</th>
                    <th scope="col">购买数量</th>
                    <th scope="col">小计</th>
                </tr>
            </thead>
            <tbody>
              <!--对象不能自己遍历 foreach 跟实体类一致 -->
              <!--绑对应订单项的值  -->
             <c:forEach items="${myorder.items}" var="oi">
               <tr style="height:80px;line-height: 50px">
                    <th scope="row">${oi.oiid}</th>
                    <td>${oi.oid}</td>
                    <td>${oi.goods.gname}</td>
                    <td>${oi.goods.gprice}元</td>
                    <td><img width="80px" src="${oi.goods.gpath}"></td>
                    <td>${oi.oinum}</td>
                    <td><span class="xx">${oi.oiprice}</span>元</td>
                </tr>
             </c:forEach> 
            </tbody>
            </table>
        <!-- 合计 -->
        <div class="text-right">
            <h2>合计:<span id="sums">229.3</span>元</h2>
           <a href="orders.do?index=6"> <button type="button" class="btn btn-success" >点击返回</button></a>
        </div>
      </c:if>
    </div>
    <!-- 引入jQuery的类库 -->
    <!-- 再引入Bootstrap的类库 -->
    <script src="js/jquery-3.6.4.js"></script>
    <script src="js/bootstrap.js"></script>
    <script type="text/javascript">
      //加载DOM  jquery
    $(function(){
     //统计价格
      var sum = 0.0;
      //遍历
      $(".xx").each(function(i,v){//下标  值
      //累计求和
      sum+=parseFloat(v.innerHTML);
      });
      //保留1位小数
      sum=sum.toFixed(2);
      //给span标签赋值
      $("#sums").html(sum);
    })
      //即要拿id 就直接把id设置成gid
      function myf(gid) {
      //拿文本框的数量
      var num=$("#"+gid).val();
      //跳转到servlet
      location.href="updateCart.do?gid="+gid+"&num="+num;
    }
    /* //如果仍然出现很多位小数 则采用以下方法保留1位小数
      String s = String.format("%.1f",this.oiprice);
      this.oiprice=Double.parseDouble(s); */
    </script>
</body>
</html>

②底层代码

package com.zking.servlet;
import java.io.IOException;
import java.io.PrintWriter;
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 javax.servlet.http.HttpSession;
import com.zking.biz.IOrderBiz;
import com.zking.biz.IUserBiz;
import com.zking.biz.OrderBiz;
import com.zking.biz.UserBiz;
import com.zking.entity.Order;
import com.zking.entity.User;
/**
 * 查看订单详情控制器
 * @author PC
 *
 */
@WebServlet("/orderInfo.do")
public class OrderInfoServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
  }
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //设置编码
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html; charset=UTF-8");
    //拿session和out
    HttpSession session = req.getSession();
    PrintWriter out = resp.getWriter();
    //接收oid
    String oid=req.getParameter("oid");
    //servlet调biz层
    IOrderBiz iob = new OrderBiz();
    //调用单个查询的方法
    Order order = iob.getOrder(oid);
    //存起来
    req.setAttribute("myorder",order);//键  值
    //跳转 转发到订单详情页面进行绑值
    req.getRequestDispatcher("orderinfo.jsp").forward(req, resp);
    //两种思路
    /**
     * select * from tb_orderitem where oid=?;
     * 1.根据订单编号查找到对应的订单项集合  存起来  去订单详情页面绑定值
     * 
     * select * from tb_order where oid=?; 单个查询   在order实体类写了一个items
     * 2.根据订单编号查找到对应的订单  把订单存起来  去订单详情界面  即可以绑定该订单的值又可以绑定订单详情的值 √
     * 
     * 
     */
  }
}

2.2 优化结算(增加销量  减少库存)

public int addOrder(Order order) {
    int n =0;
    int oid = getID("tb_order", "oid");///!!!赋值  订单编号
    OrderItemDao odao = new OrderItemDao();
    try {
      con=DBHelper.getCon();
      String sql="insert into tb_order(oid,osumprice,uuid,oaddress) values(?,?,?,?)";
        ps=con.prepareStatement(sql);
        //给占位符赋值
        ps.setInt(1, oid);
        ps.setDouble(2, order.getOsumprice());
        ps.setInt(3, order.getUser().getUuid());
        ps.setString(4, order.getOaddress());
        n=ps.executeUpdate();
        if(n>0) {//说明订单下单成功
          //那么就把该订单所对应的订单项全部加入到数据库中
          //拿到该订单所对应的订单项集合
          List<OrderItem> items = order.getItems();
          //循环遍历
          for (OrderItem oi : items) {
          //接下来我需要将所有的oi都要进tb_orderitem表
            oi.setOid(oid);//关键
            odao.addOrderItem(oi);
            //把对应商品的销量+购买数量 库存-购买数量
            new GoodsDao().updateXL(oi.getGoods().getGid(),oi.getOinum());
        }
        }
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      DBHelper.myClose(con, ps, rs);
    }
    return n;
  }
/**
   * 改变销量
   * @param gid 商品编号
   * @param num 购买数量
   * @return 影响行数
   */
  public int updateXL(int gid,int num) {
    int n = 0;
    try {
      con=DBHelper.getCon();
      String sql="update tb_goods set gxl=gxl+? where gid=?";
      ps=con.prepareStatement(sql);
      ps.setInt(1, num);
      ps.setInt(2, gid);
      n=ps.executeUpdate();
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      DBHelper.myClose(con, ps, rs);
    }
    return n;
  }


相关文章
|
存储 数据库
订单系统的设计
订单系统的设计
|
传感器 物联网 5G
物联网的通信技术以及Wi-Fi、一键配网技术、BLE、GPRS(2G)、LTE-Cat1 、NB-IoT简介
物联网的一个重要的特点是接入了网络,因此这些设备才能将传感器采集的数据上传到云平台,然后根据平台对数据的分析做出反应。而这种接入网络的技术,就是通信技术,是物联网的基础之一。通信的方式可以分为有线和无线两种方式,因为有线通信的成本较高,无线通信技术在物联网中应用比较广泛。
1384 1
|
11月前
|
人工智能 自然语言处理 安全
金融对话AI:伦敦证券交易所集团携手OpenAI重塑市场数据分析
2025年12月,LSEG与OpenAI达成战略合作,将金融数据接入ChatGPT,通过自然语言实现行情查询、估值分析等功能,推动金融分析民主化。借助MCP技术,用户可直观获取专业研报与实时数据,降低使用门槛。此举标志金融服务向智能化、直觉化转型,但也面临安全与合规挑战。#金融科技 #AI变革
576 1
|
数据挖掘
【杂学笔记甲】问题分析和解决的流程及工具介绍
【10月更文挑战第2天】该文档详细介绍了问题解决的过程,包括定义问题、测量问题、分析问题、改善问题和控制问题五个阶段。在定义问题阶段,通过组建跨职能团队和运用4W1H方法明确问题;测量问题阶段则通过逻辑图和流程图等工具进行数据分析;分析问题阶段筛选关键原因并确认;改善问题阶段提出并筛选方案,进行试运行;最后控制问题阶段实施前后对比并总结经验,为后续挑战做准备。
1232 11
【杂学笔记甲】问题分析和解决的流程及工具介绍
|
存储 安全 网络安全
都在谈数据安全,可你真的会做数据全生命周期防护吗?
数据安全远不止防火墙和杀毒软件,而是贯穿数据从产生到销毁的全过程。本文详解数据全生命周期保护,涵盖数据产生、存储、传输、处理、使用、共享、归档与销毁七大阶段,剖析各环节风险与防护要点,帮助企业构建系统性防护体系,真正守住数据安全底线。
都在谈数据安全,可你真的会做数据全生命周期防护吗?
|
SQL 存储 Apache
基于 Flink 进行增量批计算的探索与实践
本文整理自阿里云高级技术专家、Apache Flink PMC朱翥老师在Flink Forward Asia 2024的分享,内容分为三部分:背景介绍、工作介绍和总结展望。首先介绍了增量计算的定义及其与批计算、流计算的区别,阐述了增量计算的优势及典型需求场景,并解释了为何选择Flink进行增量计算。其次,详细描述了当前的工作进展,包括增量计算流程、执行计划生成、控制消费数据量级及执行进度记录恢复等关键技术点。最后,展示了增量计算的简单示例、性能测评结果,并对未来工作进行了规划。
1552 6
基于 Flink 进行增量批计算的探索与实践
|
敏捷开发 存储 数据挖掘
最佳进度跟踪工具推荐:如何提高工作效率并按时完成任务?
本文介绍了6款高效的项目进度跟踪工具,包括Banli Kanban、TeamGantt、ZenHub、LiquidPlanner、Smartsheet和Redmine,详细阐述了它们的特点、适用场景及推荐理由,旨在帮助团队根据自身需求选择最合适的工具,提升项目管理效率和团队协作能力。
1567 4
最佳进度跟踪工具推荐:如何提高工作效率并按时完成任务?
|
缓存 监控 测试技术
软件测试中的性能瓶颈分析与优化策略
本文深入探讨了在软件测试过程中,如何有效地识别和解决性能瓶颈问题。通过对性能瓶颈的定义、分类以及常见原因的分析,结合实际案例,提出了一系列针对性的优化策略和方法。这些策略旨在帮助测试人员和开发人员提高软件的性能表现,确保软件在高负载条件下依然能够稳定运行。
|
设计模式 缓存 监控
让系统具备良好的扩展性的依据
在当今快速发展的科技时代,系统的扩展性成为了设计和开发中的一个重要考虑因素,尤其是在软件开发领域,构建具有良好扩展性的系统是至关重要的。随着用户规模的增长、数据量的增加以及业务需求的演变,系统需要具备良好的扩展性,以满足不断增长的负载和应对复杂多变的业务场景。一个具备良好扩展性的系统能够在不进行大规模重构的情况下,轻松地进行水平或垂直扩展,实现高效、无缝的功能扩展,这种系统设计的优势在于其能够快速适应变化,并保持高性能和高可用性。而且扩展性是指系统在面对需求变化时,能够以一种高效、灵活和可持续的方式进行扩展和改进,一个具备良好扩展性的系统能够降低开发成本,提高代码的可维护性,同时也能更好地满足
712 3
让系统具备良好的扩展性的依据
|
数据采集 存储 安全
数据完整性详解
【8月更文挑战第31天】
2654 0