新峰商城之订单(四)订单列表

        订单生成后在个人中心的订单列表中就可以看到各种状态的订单,此文简述订单列表的制作。

一、订单列表数据格式

        订单列表OrderListVO对象编码如下所示:

/*** 订单列表页面VO*/
public class NewBeeMallOrderListVO implements Serializable {private Long orderId;private String orderNo;private Integer totalPrice;private Byte payType;private Byte orderStatus;private String orderStatusString;private String userAddress;private Date createTime;private List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS;

        在此List对象中即有订单表中的字段,也有订单项表中的字段,包括订单状态、订单交易时间、订单总价、商品标题、商品预览图、商品价格等属性,一个订单可含有多个订单项,所以其中也有一订单项VO列表对象。

二、订单列表数据的获取

在OrderService业务类中新增getMyOrders()方法,代码如下所示:

@Overridepublic PageResult getMyOrders(PageQueryUtil pageUtil) {int total = newBeeMallOrderMapper.getTotalNewBeeMallOrders(pageUtil);List<NewBeeMallOrder> newBeeMallOrders = newBeeMallOrderMapper.findNewBeeMallOrderList(pageUtil);List<NewBeeMallOrderListVO> orderListVOS = new ArrayList<>();if (total > 0) {//数据转换 将实体类转成voorderListVOS = BeanUtil.copyList(newBeeMallOrders, NewBeeMallOrderListVO.class);//设置订单状态中文显示值for (NewBeeMallOrderListVO newBeeMallOrderListVO : orderListVOS) {newBeeMallOrderListVO.setOrderStatusString(NewBeeMallOrderStatusEnum.getNewBeeMallOrderStatusEnumByStatus(newBeeMallOrderListVO.getOrderStatus()).getName());}List<Long> orderIds = newBeeMallOrders.stream().map(NewBeeMallOrder::getOrderId).collect(Collectors.toList());if (!CollectionUtils.isEmpty(orderIds)) {List<NewBeeMallOrderItem> orderItems = newBeeMallOrderItemMapper.selectByOrderIds(orderIds);Map<Long, List<NewBeeMallOrderItem>> itemByOrderIdMap = orderItems.stream().collect(groupingBy(NewBeeMallOrderItem::getOrderId));for (NewBeeMallOrderListVO newBeeMallOrderListVO : orderListVOS) {//封装每个订单列表对象的订单项数据if (itemByOrderIdMap.containsKey(newBeeMallOrderListVO.getOrderId())) {List<NewBeeMallOrderItem> orderItemListTemp = itemByOrderIdMap.get(newBeeMallOrderListVO.getOrderId());//将NewBeeMallOrderItem对象列表转换成NewBeeMallOrderItemVO对象列表List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS = BeanUtil.copyList(orderItemListTemp, NewBeeMallOrderItemVO.class);newBeeMallOrderListVO.setNewBeeMallOrderItemVOS(newBeeMallOrderItemVOS);}}}}PageResult pageResult = new PageResult(orderListVOS, total, pageUtil.getLimit(), pageUtil.getPage());return pageResult;}

       这里定义了getMyOrders()方法并传入PageUtil对象作为参数。PageUtil对象中有分页参数和用户的userId,并且通过SQL语句查询出当前userId下的订单列表数据和每个订单所关联的订单项列表数据。之后填充数据,即将相关字段封装到NewBeeMallOrderListVO对象中,并将封装好的List对象返回。

在OrderController控制类中新增OrderListPage()方法,代码如下所示:

@GetMapping("/orders")public String orderListPage(@RequestParam Map<String, Object> params, HttpServletRequest request, HttpSession httpSession) {NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);params.put("userId", user.getUserId());if (ObjectUtils.isEmpty(params.get("page"))) {params.put("page", 1);}params.put("limit", Constants.ORDER_SEARCH_PAGE_LIMIT);//封装我的订单数据PageQueryUtil pageUtil = new PageQueryUtil(params);request.setAttribute("orderPageResult", newBeeMallOrderService.getMyOrders(pageUtil));request.setAttribute("path", "orders");return "mall/my-orders";}

        该方法首先将分页参数和当前用户的userId封装到PageQueryUtil对象中并调用了业务层的方法。然后把当前用户的订单数据按照不同的分页参数查询出来并将返回结果放到request对象中。最后跳转到mall目录下的my-orders.html模板页面进行数据渲染。 

三、订单列表页面渲染

        在resources/templates/mall目录中新增模板my-orders.html, 模板代码如下所示:

<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:replace="mall/header::head-fragment('NewBee商城-订单列表','my-orders')">
</head>
<body>
<header th:replace="mall/header::header-fragment"></header>
<!-- nav -->
<nav th:replace="mall/header::nav-fragment"></nav><!-- personal -->
<div id="personal"><div class="self-info center"><!-- sidebar --><div th:replace="mall/personal-sidebar::sidebar-fragment"></div><div class="intro fr"><div class="uc-box uc-main-box"><div class="uc-content-box order-list-box"><div class="box-hd"><h1 class="title">我的订单<small>请谨防钓鱼链接或诈骗电话,<a href="##">了解更多&gt;</a></small></h1></div><div class="box-bd"><div id="J_orderList"><ul class="order-list"><th:block th:if="${#lists.isEmpty(orderPageResult.list)}"><img style="margin-top: 16px;"th:src="@{/mall/image/null-content.png}"><small><a th:href="@{/index}">&nbsp;&nbsp;&nbsp;&nbsp;去购物&gt;</a></small></th:block><th:block th:unless="${#lists.isEmpty(orderPageResult.list)}"><th:block th:each="order : ${orderPageResult.list}"><li class="uc-order-item uc-order-item-list"><div class="order-detail"><div class="order-summary"><th:block th:if="${order.orderStatus<0}"><div class="order-status-closed"></th:block><th:block th:if="${order.orderStatus==0}"><div class="order-status-need-pay"></th:block><th:block th:if="${order.orderStatus>0}"><div class="order-status-success"></th:block><th:block th:text="${' '+order.orderStatusString}"></th:block></div></div><table class="order-detail-table"><thead><tr><th class="col-main"><p class="caption-info">下单时间:<th:block th:text="${#dates.format(order.createTime, 'yyyy-MM-dd HH:mm:ss')}">02月07日</th:block><span class="sep">|</span>订单号:<ath:href="@{${'/orders/'+order.orderNo}}"th:text="${order.orderNo}">201908121807</a></p></th><th class="col-sub"><p class="caption-price">应付金额:<spanclass="num"th:text="${order.totalPrice+'.00'}">1299.00</span>元</p></th></tr></thead><tbody><tr><td class="order-items"><ul class="goods-list"><th:blockth:each="item : ${order.newBeeMallOrderItemVOS}"><li><div class="figure figure-thumb"><a target="_blank"th:href="@{'/goods/detail/'+${item.goodsId}}"><img th:src="@{${item.goodsCoverImg}}"width="80" height="80" alt=""></a></div><p class="name"><a target="_blank"th:href="@{'/goods/detail/'+${item.goodsId}}"th:text="${item.goodsName}">newbee</a></p><p class="price"th:text="${item.sellingPrice+'元 x '+item.goodsCount}">13元 × 1</p></li></th:block></ul></td><td class="order-actions"><a class="btn btn-small btn-line-gray"th:href="@{${'/orders/'+order.orderNo}}">订单详情</a></td></tr></tbody></table></div></li></th:block></th:block></ul></div><th:block th:unless="${#lists.isEmpty(orderPageResult.list)}"><div id="J_orderListPages"><div class="newbee-pagenavi"><th:block th:if="${orderPageResult.currPage-2 >=1}"><aclass="numbers"th:href="@{'/orders?page=' + ${orderPageResult.currPage-2}}"th:text="${orderPageResult.currPage -2}">1</a></th:block><th:block th:if="${orderPageResult.currPage-1 >=1}"><aclass="numbers"th:href="@{'/orders?page=' + ${orderPageResult.currPage-1}}"th:text="${orderPageResult.currPage -1}">1</a></th:block><a href="##" class="numbers current" th:text="${orderPageResult.currPage}">1</a><th:block th:if="${orderPageResult.currPage+1<=orderPageResult.totalPage}"><aclass="numbers"th:href="@{'/orders?page=' + ${orderPageResult.currPage+1}}"th:text="${orderPageResult.currPage +1}">1</a></th:block><th:block th:if="${orderPageResult.currPage+2<=orderPageResult.totalPage}"><aclass="numbers"th:href="@{'/orders?page=' + ${orderPageResult.currPage+2}}"th:text="${orderPageResult.currPage +2}">1</a></th:block></div></div></th:block></div></div></div></div><div class="clear"></div>
</div>
</div><div th:replace="mall/footer::footer-fragment"></div><!-- jQuery -->
<script th:src="@{/admin/plugins/jquery/jquery.min.js}"></script>
<script th:src="@{/mall/js/search.js}" type="text/javascript"></script></body>
</html>

        在该页面中主要进行了两部分的数据读取和渲染,分别是订单数据列表渲染和分页区域的渲染。在订单列表区域和分页功能区域对应的位置读取orderPageResult对象中的list数据和分页数据。list数据为订单列表数据。使用th:each循环语法将订单状态、订单交易时间、订单总价、商品标题字段、商品预览图字段、商品价格字段、商品购买数量字段渲染出来。在渲染商品信息的时候用到了一个th:each循环语法和一个a标签。在点击对应按钮后会跳转到订单详情页面。

        根据分页字段当前页码currPage、总页码totalPage将下方的分页按钮渲染出来。这里的分页并没有借助插件来实现,而是通过自行编码的方式来生成。

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

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

相关文章

Kylinsec操作系统

外网源 发布地址&#xff1a;http://mirrorlist.kylinsec.com.cn:8888/publicrepo/

Git(5):分支合并merge和rebase

git merge 假设有两个分支&#xff1a;master 分支和 feature 分支&#xff0c;现在需要将 feature 分支合并到 master 分支。 git checkout mastergit merge feature在合并分支时&#xff0c;git 提供了不同的合并策略&#xff0c;用于处理不同的合并场景。 Fast-forward 如…

《百家姓》中排名第八却是中国人口第一大姓-王姓

王姓在《百家姓》中虽然排名第八&#xff0c;但根据近年来的统计数据和实际人口分布&#xff0c;王姓已成为中国第一大姓。以下是对王姓作为“百家姓之首”的详细解析&#xff1a; 一、人口数量与分布 人口数量&#xff1a;截至当前时间&#xff08;2024年&#xff09;&#x…

Jmeter 配置元件-计数器时间变量

计数器 在 JMeter 中&#xff0c;计数器是一个非常有用的配置元件&#xff0c;可以帮助你在每次请求时生成递增的数字。 在线程组下新增计数器 配置计数器 开始值&#xff08;Starting value&#xff09;&#xff1a;给定计数器的起始值、初始值&#xff0c;第一次迭代时&…

我们离生成式 AI 应用全面爆发还有多远?2024 全球产品经理大会透露了这些关键信号

GenAI 应用爆发何时到来、生成式 AI 应用到底该怎么做……大模型浪潮已经有将近两年的时间&#xff0c;去年狂卷模型&#xff0c;今年业内则一致认为是应用落地元年&#xff0c;但其间困惑诸多&#xff0c;产品人与创业者们该何去何从&#xff0c;答案尽在 2024 全球产品经理大…

Linux 常用命令(待更新)

1、pwd命令 2、cd命令 3、ls命令 4、locate命令 5、clear命令 6、cat命令 7、head命令 8、tail命令 9、grep命令 10、chmod命令 11、cp命令 12、mv命令 13、mkdir命令 14、rm命令 15、文件压缩和有关归档的命令 16、文件系统的命令 17、与系统管理相关的命令 …

七种修复错误:由于找不到msvcr110.dll 无法继续执行的方法

当你在运行某些程序时遇到“找不到msvcr110.dll”的错误提示&#xff0c;这通常意味着你的系统缺少了Microsoft Visual C 2012 Redistributable包中的一个重要文件。这个DLL文件是Microsoft Visual C Redistributable的一部分&#xff0c;用于支持许多使用Visual C编写的软件和…

Linux:文件描述符详解

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程&#xff0c;都拥有自己的文件描述符(File Descriptor, FD)&#xff0c;它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

链接器查找其他动态库的过程

export LD_DEBUGall 2./your_program 这将输出所有的调试信息&#xff0c;包括搜索路径、库的加载、符号解析等详细信息。 关闭用unset LD_DEBUG 常用的 LD_DEBUG 选项包括&#xff1a; all: 输出所有调试信息。paths: 显示搜索路径信息。files: 显示文件打开和关闭的信息。…

使用天地图实现只展示某个市的功能

可参考 天地图部分功能hooks封装useTdtMap.js 和 处理geoJson格式数据并能回显至天地图上 下面实现效果类似于百度地图-展示部分区域 功能图 部分代码 const initLoad () > {mapInit().then((res) > {map.value res;var layers map.value.getLayers();layers.forEac…

CSS04-Chrome调试工具

Chrome 浏览器提供了一个非常好用的调试工具&#xff0c;可以用来调试我们的 HTML结构和 CSS 样式。

成功使用DDNS动态域名访问我的群晖NAS(TP-link路由器)

当NAS设备部署在动态IP环境中&#xff08;如家庭或小型办公室宽带&#xff09;&#xff0c;远程访问常常受到IP地址频繁变动的困扰。为了解决这一问题&#xff0c;结合神卓互联NAS公网助手提供的DDNS&#xff08;动态域名服务&#xff09;功能&#xff0c;我们可以轻松实现通过…

keil软件编写第一个c语言单片机程序并下载到单片机点亮一个发光二极管

Project-->new project-->选择文件夹-->输入工程名如&#xff1a;lession_1-->选择单片机芯片类型&#xff08;Atml的89c52&#xff09;-->newfile -->保存输入C语言文件名lession_1.c-->在左侧source Group 1右键--->选择add files to group “Source…

FPGA实现频率、幅度、相位可调的DDS以及DDS Compiler IP核的使用验证

文章目录 一、DDS介绍二、DDS原理2.1 频率计算2.2 相位改变2.3 波形切换 三、Matlab生成波形文件四、FPGA实现DDS4.1 Verilog代码4.2 仿真验证4.2.1 改变频率4.2.2 切换波形4.2.3 相位调节4.2.4 幅度调节 五、Xilinx DDS Compiler的使用5.1 功能框图5.1.1 相位累加器5.1.2 SIN/…

Linux系统接口--信号量、互斥锁、原子操作和自旋锁的区别

1、基本概念 1.1 信号量&#xff08;Semaphore&#xff09; &#xff08;1&#xff09;定义 信号量是一种计数器&#xff0c;用于控制对共享资源的访问&#xff0c;允许多个线程同时访问一定数量的资源。 &#xff08;2&#xff09;特点 计数型信号量&#xff1a; 信号量有…

FSMC寄存器方式初始化及LCD函数

环境 芯片:STM32F103ZET6 库&#xff1a;stm32f10x.h 原理图 代码 Driver.FSMC.h #ifndef __DRIVER_FSMC #define __DRIVER_FSMC #include "stm32f10x.h"void Driver_FSMC_Init(void);#endifDriver.FSMC.c #include "Driver_FSMC.h"/*** 配置FSMC(Flexi…

最新免费商用无版权素材(免费图库 抠图 PNG 插画素材)

今天我要给大家揭秘几个私藏的宝藏网站——那些免费、商用无版权的素材资源站&#xff01;&#x1f389; 这些站点简直好用到爆炸&#x1f4a5;&#xff0c;每次需要找素材&#xff0c;它们总能秒速响应&#xff0c;让我们的工作效率直线飙升&#xff01;&#x1f680; 这里不…

32岁前端干了8年,是继续做前端开发,还是转其它工作_ui设计师转开发

前端发展有瓶颈&#xff0c;变来变去都是那一套&#xff0c;只是换了框架换了环境。换了框架后又得去学习&#xff0c;虽然很快上手&#xff0c;但是那些刚毕业的也很快上手了&#xff0c;入门门槛越来越低&#xff0c;想转行或继续卷&#xff0c;该如何破圈? 这是一位网友的自…

nmap 命令:网络扫描

一、命令简介 ​nmap​&#xff08;Network Mapper&#xff09;是一个开放源代码的网络探测和安全审核的工具。它最初由Fyodor Vaskovich开发&#xff0c;用于快速地扫描大型网络&#xff0c;尽管它同样适用于单个主机。 ​nmap​的功能包括&#xff1a; 发现主机上的开放端…

基于 BERT 的自定义中文命名实体识别实现

基于 BERT 的自定义中文命名实体识别实现 在自然语言处理中,命名实体识别(Named Entity Recognition,NER)是一项重要的任务,旨在识别文本中的特定实体,如人名、地名、组织机构名等。本文将介绍如何使用 BERT 模型实现自定义中文命名实体识别,并提供详细的代码分析和解读…