目录
一.效果预览
二. 实现思路
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;
}