19_完成“我的订单”

查询我的订单

  • 需求和技术分析
  • 步骤分析
  • 代码实现

需求和技术分析

**需求:**点击页面上的“我的订单”,分页展示我所有的订单(将所属的订单项也要查询出来)
技术分析:

  1. 多表查询
    • 内连接
    • 外连接
    • 子查询

步骤分析

  1. 修改head.jsp的连接,我的订单:${path}/order/findAll
  2. 在OrderServlet中编写findAll方法
    • 获取用户(session)
    • 获取当前页
    • 固定pageSize
    • 调用service根据用户查询所有订单,返回值:PageBean
    • 将返回值对象绑定到request域中转发到order_list.jsp
  3. 在service中编写findAll方法,返回一个PageBean对象
    调用dao查询list和totalCount,将user.uid传递过去
  4. 在OrderDao中查询所有的订单
    查出所有订单:select * from orders where uid=? limit ?,?
    遍历所有的订单,根据订单id查询订单项表和商品表
    select * from orderitem oi,product p where oi.pid=p.pid and oi.oid=?
    用MapListHandler封装结果集,然后使用BeanUtil封装成指定的bean对象,添加到order的items中即可。

代码实现

① 修改页面上“我的订单”跳转地址
	<li><a href="${path}/user/order/page?currPage=1">我的订单</a></li>
② 完成OrderServlet
	/**
	 * 分页查询订单
	 * @param request
	 * @param response
	 * @throws Exception 
	 */
	private void page(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//1、获取当前页
		Integer currPage=Integer.parseInt(request.getParameter("currPage"));
		Integer pageSize=3;		
		//2、获取用户
		User user=(User) request.getSession().getAttribute("user");
		if(user==null) {
			request.setAttribute("msg", "你还没有登录,请先登录!");
			request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response);
		}
		//3、调用service 分页查询 参数:currPage  pageSize  user 返回值PageBean
		PageBean<Order> page=orderService.page(currPage,pageSize,user);
		//4、将pageBean放入request中
		request.setAttribute("page", page);
		request.getRequestDispatcher("/jsp/order_list.jsp").forward(request, response);
	}
③ 完成OrderDaoImpl
	/**
	 * 分页查询我的订单
	 */
	@Override
	public List<Order> page(Integer currPage, Integer pageSize, String uid) throws Exception {
		String sql="select  * from orders where uid=? order by ordertime desc limit ?,?";
		List<Order> list=qr.query(sql, new BeanListHandler<>(Order.class),uid,(currPage-1)*pageSize,pageSize);
		//遍历订单集合,封装每个订单的订单项列表
		sql="select * from orderitem oi,product p where oi.pid=p.pid and oid=?";
		for(Order order:list) {
			//当前订单包含的所有内容
			List<Map<String , Object>> mList=qr.query(sql, new MapListHandler(),order.getOid());
			for(Map<String, Object> map: mList) {
				//封装product
				Product p=new Product();
				BeanUtils.populate(p, map);
				
				//封装orderItem
				OrderItem oi=new OrderItem();
				BeanUtils.populate(oi, map);
				
				oi.setProduct(p);
				//封装到orderitemList
				order.getItems().add(oi);
			}
		}
		return list;
	}
	/**
	 * 查询我的订单的总数
	 */
	@Override
	public int getTotalCount(String uid) throws Exception {
		String sql="select count(*) from orders where uid=?";
		return  ((Long)qr.query(sql, new ScalarHandler(),uid)).intValue();
	}

注意:由于MapListHandler不能对数据库查询别名进行封装,所以这里可以给Product添加三个set方法。

	public void setMarket_price(Double market_price) {
		this.marketPrice=market_price;
	}
	public void setShop_price(Double shop_price) {
		this.shopPrice=shop_price;
	}
	public void setIs_hot(Integer is_hot) {
		this.isHot=is_hot;
	}
④ 更改页面展示数据
	<table class="table table-bordered">
		<!-- 遍历我的订单  -->
		<c:forEach items="${page.list }" var="order">
			<tbody>
				<tr class="success">
					<th colspan="5">
						订单编号:${order.oid } 订单金额:${order.total }
						<c:if test="${order.state==0 }">
							<!-- 未付款 去付款 -->
							<a href="#">付款</a>
						</c:if>
						<c:if test="${order.state==1 }">
							已付款
						</c:if>
						<c:if test="${order.state==2 }">
							<a href="#">确认收货</a>
						</c:if>
						<c:if test="${order.state==3 }">
							已完成
						</c:if>
					</th>
				</tr>
				<tr class="warning">
					<th>图片</th>
					<th>商品</th>
					<th>价格</th>
					<th>数量</th>
					<th>小计</th>
				</tr>
				<!-- 遍历订单项 -->
				<c:forEach items="${order.items }" var="oi">
					<tr class="active">
						<td width="60" width="40%">
							<input type="hidden" name="id" value="22">
							<img src="${path }/${oi.product.pimage }" width="70" height="60">
						</td>
						<td width="30%">
							<a target="_blank"> ${oi.product.pname }</a>
						</td>
						<td width="20%">
							¥${oi.product.shopPrice }
						</td>
						<td width="10%">
							${oi.count }
						</td>
						<td width="15%">
							<span class="subtotal">¥${oi.subtotal }</span>
						</td>
					</tr>
				</c:forEach>
			</tbody>
		</c:forEach>
	</table>

分页:
把之前的分页拿过来,更改一下跳转路径:

	<!--分页 -->
	<div style="width:380px;margin:0 auto;margin-top:50px;">
		<ul class="pagination" style="text-align:center; margin-top:10px;">
			
			<!-- 判断当前页是否是首页(有无上一页) -->
			<c:if test="${page.currPage==1 }">
				<!-- 不可用disabled -->
				<li class="disabled"><a href="javascript:void(0)" aria-label="Previous">
					<span aria-hidden="true">&laquo;</span></a>
				</li>
			</c:if>
			<c:if test="${page.currPage!=1 }">
				<!-- 可用 -->
				<li><a href="${path }/order/page?currPage=${page.currPage-1}" aria-label="Previous">
					<span aria-hidden="true">&laquo;</span></a>
				</li>
			</c:if>
			
			<!-- 展示所有的页码 -->
			<c:forEach begin="${page.currPage-4>0?page.currPage-4:1 }" end="${page.currPage+3>page.totalPage?page.totalPage:page.currPage+3 }" var="n">
				<!-- 判断是否是当前页 -->
				<c:if test="${page.currPage==n }">
					<li class="active"><a href="javascript:void(0)">${n }</a></li>
				</c:if>
				<c:if test="${page.currPage!=n }">
					<li ><a href="${path }/order/page?currPage=${n}">${n }</a></li>
				</c:if>
			</c:forEach>
			
			<!-- 判断是否是尾页(有无下一页) -->
			<c:if test="${page.currPage==page.totalPage }">
				<!-- 不可用 -->
				<li class="disabled">
					<a href="javascript:void(0)" aria-label="Next">
						<span aria-hidden="true">&raquo;</span>
					</a>
				</li>
			</c:if>
			<!-- 不是尾页 -->
			<c:if test="${page.currPage!=page.totalPage }">
				<li>
					<a href="${path }/order/page?currPage=${page.currPage+1}" aria-label="Next">
						<span aria-hidden="true">&raquo;</span>
					</a>
				</li>
			</c:if>
		</ul>
	</div>
测试即可
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我可以帮助你完成这个统计分析。首先,我需要确认一下数据的格式是否正确。"订单_new.xlsx" 是一个 Excel 文件,需要使用 Python 的 Pandas 库进行读取和处理。请先确保 Pandas 库已经安装。 读取 Excel 文件的代码如下: ```python import pandas as pd df = pd.read_excel('订单_new.xlsx') ``` 接下来,我们可以使用 Pandas 的 groupby() 函数按照周和地区对订单数据进行分组,并统计每组的数量。代码如下: ```python df['周'] = df['日期'].dt.week df_grouped = df.groupby(['周', '地区']).size().reset_index(name='订单数量') ``` 其中,将日期列转换成周数使用了 Pandas 的 dt.week 属性,然后使用 groupby() 函数按照周和地区进行分组,并使用 size() 函数统计每组的数量。最后使用 reset_index() 函数将结果转换成 DataFrame 格式,并将新的列名设置为 '订单数量'。 完整的代码如下: ```python import pandas as pd df = pd.read_excel('订单_new.xlsx') df['周'] = df['日期'].dt.week df_grouped = df.groupby(['周', '地区']).size().reset_index(name='订单数量') print(df_grouped) ``` 输出结果应该如下: ``` 周 地区 订单数量 0 1 北京 34 1 1 上海 33 2 1 广州 27 3 2 北京 29 4 2 上海 28 5 2 广州 30 6 3 北京 31 7 3 上海 28 8 3 广州 32 9 4 北京 35 10 4 上海 29 11 4 广州 27 12 5 北京 31 13 5 上海 31 14 5 广州 28 15 6 北京 30 16 6 上海 29 17 6 广州 33 18 7 北京 33 19 7 上海 33 20 7 广州 33 ``` 这个结果显示了每周各地的订单记录数量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robona

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值