说明:

(1)本篇博客的内容:开发【前台:订单详情】接口;

(2)本篇博客的整体逻辑比较简单;需要注意的地方有两点:

● 要做好权限校验;

● 需要根据接口对返回数据的格式要求,去组织数据;

目录

一:【前台:订单详情】接口介绍;

1.【前台:订单详情】接口,接口文档;

2.【前台:订单详情】接口,在界面上的表现;

二:正式开发;

1.在OrderController中,创建处理【前台:订单详情】接口请求的方法:detail()方法;

2.在OrderServiceImpl中,编写获取订单详情的逻辑方法:detail()方法;

3.在OrderService中,方向生成方法的定义;

三:测试;


一:【前台:订单详情】接口介绍;

1.【前台:订单详情】接口,接口文档;


可以看到,接口要求的返回数据的格式,使用以前创建的Order和OrderItem去包装数据,都不能满足要求;

所以,为了能够更好的组织数据,以满足接口对返回数据格式的要求,我们创建了OrderVO实体类和OrderItemVO实体类:

OrderItemVO:

package com.imooc.mall.model.vo;import java.util.Date;public class OrderItemVO {private String orderNo;private String productName;private String productImg;private Integer unitPrice;private Integer quantity;private Integer totalPrice;public String getOrderNo() {return orderNo;}public void setOrderNo(String orderNo) {this.orderNo = orderNo;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}public String getProductImg() {return productImg;}public void setProductImg(String productImg) {this.productImg = productImg;}public Integer getUnitPrice() {return unitPrice;}public void setUnitPrice(Integer unitPrice) {this.unitPrice = unitPrice;}public Integer getQuantity() {return quantity;}public void setQuantity(Integer quantity) {this.quantity = quantity;}public Integer getTotalPrice() {return totalPrice;}public void setTotalPrice(Integer totalPrice) {this.totalPrice = totalPrice;}
}

OrderVO:

package com.imooc.mall.model.vo;import com.imooc.mall.model.pojo.OrderItem;import java.util.Date;
import java.util.List;public class OrderVO {//很显然,我不能返回order表的id字段,否则会暴露我们商城的业务量这种秘密信息;//当然,接口中业没有要求返回order表的id信息;//    private Integer id;private String orderNo;private Integer userId;private Integer totalPrice;private String receiverName;private String receiverMobile;private String receiverAddress;private Integer orderStatus;private Integer postage;private Integer paymentType;private Date deliveryTime;private Date payTime;private Date endTime;private Date createTime;private Date updateTime;private String orderStatusName;private List<OrderItemVO> orderItemVOList;public String getOrderNo() {return orderNo;}public void setOrderNo(String orderNo) {this.orderNo = orderNo;}public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public Integer getTotalPrice() {return totalPrice;}public void setTotalPrice(Integer totalPrice) {this.totalPrice = totalPrice;}public String getReceiverName() {return receiverName;}public void setReceiverName(String receiverName) {this.receiverName = receiverName;}public String getReceiverMobile() {return receiverMobile;}public void setReceiverMobile(String receiverMobile) {this.receiverMobile = receiverMobile;}public String getReceiverAddress() {return receiverAddress;}public void setReceiverAddress(String receiverAddress) {this.receiverAddress = receiverAddress;}public Integer getOrderStatus() {return orderStatus;}public void setOrderStatus(Integer orderStatus) {this.orderStatus = orderStatus;}public Integer getPostage() {return postage;}public void setPostage(Integer postage) {this.postage = postage;}public Integer getPaymentType() {return paymentType;}public void setPaymentType(Integer paymentType) {this.paymentType = paymentType;}public Date getDeliveryTime() {return deliveryTime;}public void setDeliveryTime(Date deliveryTime) {this.deliveryTime = deliveryTime;}public Date getPayTime() {return payTime;}public void setPayTime(Date payTime) {this.payTime = payTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime = endTime;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getUpdateTime() {return updateTime;}public void setUpdateTime(Date updateTime) {this.updateTime = updateTime;}public String getOrderStatusName() {return orderStatusName;}public void setOrderStatusName(String orderStatusName) {this.orderStatusName = orderStatusName;}public List<OrderItemVO> getOrderItemVOList() {return orderItemVOList;}public void setOrderItemVOList(List<OrderItemVO> orderItemVOList) {this.orderItemVOList = orderItemVOList;}
}

2.【前台:订单详情】接口,在界面上的表现;

我们可以点击某个订单,去查看订单详情;


二:正式开发;

1.在OrderController中,创建处理【前台:订单详情】接口请求的方法:detail()方法;

    /*** 【前台:订单详情】接口;* @param orderNo* @return*/@ApiOperation("订单详情")@GetMapping("/order/detail")public ApiRestResponse detail(@RequestParam("orderNo") String orderNo) {OrderVO orderVO = orderService.detail(orderNo);return ApiRestResponse.success(orderVO);}

说明:

(1)请求方式、url,参数,要符合接口要求;

(2)我们在Service层,编写了一个获取订单详情的逻辑方法:detail()方法;这在下一部分介绍;

2.在OrderServiceImpl中,编写获取订单详情的逻辑方法:detail()方法;

 /*** 根据订单号,获取订单详情* @param orderNo* @return*/@Overridepublic OrderVO detail(String orderNo) {//首先,调用Dao层方法;根据订单号,去查询订单;Order order = orderMapper.selectByOrderNo(orderNo);//如果根据订单号,没有查到订单,就抛出“订单不存在”异常;if (order == null) {throw new ImoocMallException(ImoocMallExceptionEnum.NO_ORDER);}//如果订单存在,还要看下,这个订单是不是属于当前登录用户的;(因为可能存在,A用户去查一个属于B用户的订单:产生横向越权)// 如果当前订单不属于当前登录用户,则抛出“订单不属于你”异常;Integer userId = UserFilter.currentUser.getId();if (!order.getUserId().equals(userId)) {throw new ImoocMallException(ImoocMallExceptionEnum.NOT_YOUR_ORDER);}//调用工具方法:根据订单,按照接口对返回数据的要求,去组织订单详情数据OrderVO orderVO = getOrderVO(order);return orderVO;}/*** 根据order订单信息,拼装【接口要求的数据格式】:OrderVO* @param order*/private OrderVO getOrderVO(Order order) {//(1),创建一个OrderVO,然后把【order中,与orderVO中重复的属性,,,复制到orderVO上去】OrderVO orderVO = new OrderVO();BeanUtils.copyProperties(order, orderVO);//(2),获取该订单的orderItemVOList(即,获取该订单中,每种商品的信息)//根据orderNo,获取对应的OrderItem信息;List<OrderItem> orderItemList = orderItemMapper.selectByOrderNo(order.getOrderNo());List<OrderItemVO> orderItemVOList = new ArrayList<>();//按照接口对返回数据的要求,把OrderItem转化为OrderItemVO;for (int i = 0; i < orderItemList.size(); i++) {OrderItem orderItem =  orderItemList.get(i);OrderItemVO orderItemVO = new OrderItemVO();BeanUtils.copyProperties(orderItem, orderItemVO);orderItemVOList.add(orderItemVO);}//该订单的orderItemVOList,赋值给OrderVO;orderVO.setOrderItemVOList(orderItemVOList);//(3),获取待订单的订单状态码Integer orderStatus = order.getOrderStatus();//我们前面把订单状态定义在了枚举类中;借助我们定义的枚举,根据订单状态码获取订单状态的具体内容String orderStatusName = Constant.OrderStatusEnum.codeOf(orderStatus).getValue();//把订单状态的具体信息,赋值到OrderItem的属性上去orderVO.setOrderStatusName(orderStatusName);return orderVO;}

说明:

(1)根据【接口要求的返回数据格式,我们创建了OrderVO这个实体类】;所以,我们detail()方法的返回值类型需要是OrderVO类型的;;也就是说,我们service层的方法,在获取到订单详情数据后,需要包装成OrderVO格式;

(2)首先,我们要根据接口传过来的订单号,去order订单表中,去查;

● 这儿,我们在OrderMapper中,编写了一个根据订单号查询订单的方法:

(3)如果,根据接口传的订单号,没有查到订单,我们就抛出“订单不存在”异常;

(4)就算根据订单号查到了订单;但,发现查到的订单的所属用户和当前登录用户不一样;就抛出“这个订单不属于你”的异常;(否则就会产生横向越权)

(5)然后,一切检查OK后,我们需要做的就是,组装符合接口要求格式的返回数据了;我们编写了getOrderVO()这个工具方法,用来拼装订单详情数据;

(6.1)首先,我们需要把Order中,与OrderVO重复的属性,赋值给OrderVO对象;

(6.2)然后,去查询该订单中的,每种商品的信息;也就是查询order_item表,得到OrderItem格式的数据;为此,我们在OrderItemMapper中,编写了一个根据订单号,查询该订单中是所有商品的方法;

(6.3)然后,把查到的所有OrderItem格式的数据,转化为OrderItemVO格式的数据;

(6.4)然后,把得到的List<OrderItemVO>赋值给OrderVO;

(6.5)然后,就是根据订单状态码,获取订单状态信息,然后赋值给OrderVO了;

● 可以看到,这儿我们就用到了我们在【附加:枚举类;(本篇博客,没什么新的内容;只是,这儿用到了遍历枚举中枚举项的方法;)】中介绍的,使用到了遍历枚举的枚举项技术的codeOf()方法;

(7)至此,OrderVO我们就组装好了;

(8)Service层,把这个组装好的OrderVO返回给Controller层;

3.在OrderService中,方向生成方法的定义;


三:测试;

Spring Boot电商项目54:订单模块三:【前台:订单详情】接口;相关推荐

  1. Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)

    说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...

  2. Spring Boot电商项目59:订单模块八:【后台:订单列表】接口;

     说明: (1)本篇博客的主要内容是开发[后台:订单列表]接口: (2)本篇博客没什么难点:只需要注意:[前台:订单列表]接口是查询当前登录用户的订单数据:[后台:订单列表]接口是查询所有用户的订单数 ...

  3. Spring Boot电商项目17:用户模块六:注册接口开发之:使用【GlobalExceptionHandler】来全局统一处理异常;(涉及了@ControllerAdvice等注解)

    说明: (1)为什么写这篇博客?:在[Spring Boot电商项目15:用户模块四:注册接口开发:]中,在Service层中遇到了[用户名重复]的情况,然后Service层把这个情况做成了一个异常, ...

  4. Spring Boot电商项目:概述;

    说明: (1)强调:该Spring Boot电商项目中,会有大量的以前接触过的内容:但是,当我们遇到的时候,也会重新啰嗦.重复解释:以达到该专栏形成一个比较好的闭环的目的: 目录 一:Spring B ...

  5. Spring Boot电商项目

    Spring Boot电商项目 一.概述 1.电商项目整体介绍 (1)前台模块具体分析 (2)后台模块具体分析 (3) 项目演示 2 . 项目开发所需工具准备 二. 数据库设计于项目初始化 1.表设计 ...

  6. 一套仿阿里完整版Spring Boot电商项目,前后端分离+权限管理系统

    项目简介 1.项目背景 2. B2B 模式 3. B2C 模式 ==(商城模式)*== 4. C2B 模式 5. C2C 模式 6. O2O 模式 2.商城架构图 2.1.前后端分离 基础版 2.3. ...

  7. Spring Boot电商项目52:订单模块一:订单模块介绍;(模块介绍;效果演示;数据库设计;9个接口介绍;)

    说明: (1)本篇博客的内容:本篇博客,简单梳理下[订单模块]的基本内容: (2)声明:[订单模块]是一个比较复杂的模块,其中涉及了订单的状态的改变和订单的流转:所以,本篇博客,只是简单介绍了[订单模 ...

  8. java烟草项目功能模块_一个电商项目的功能模块梳理

    电商项目核心玩法:定制商品+供应链(商品辅料库)+网红社区 最近做项目,功能越来越多,想清晰地理解项目,有点累了. 今天抽空,把这个项目的核心功能模块简要总结下,顺便画了个图. 一.全局功能模块图 二 ...

  9. 【spring boot】5.spring boot 创建web项目并使用jsp作前台页面

    贼烦的是,使用spring boot 创建web项目,然后我再idea下创建的,but 仅仅启动spring boot的启动类,就算整个项目都是好着的,就算是能够进入controller中,也不能成功 ...

  10. spring boot电商系统前端界面设计与浏览器兼容性研究 毕业设计-附源码231058

    摘  要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势:对于电商系统前端界面设计与浏览器兼容性研究当然也不能排除在外,随着网络技术的不断成熟,带动了电商系统前 ...

最新文章

  1. 布尔类型和三目运算符
  2. SQL Server 环形缓冲区(Ring Buffer) -- 介绍
  3. 【Android开发】构建Android源码编译环境
  4. 基于 Module 的 Laravel API 架构
  5. 237. 删除链表中的节点(C语言)
  6. html5app大赛,Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结
  7. 获取请求的url java_Java获取此次请求URL以及服务器根路径的方法
  8. clustered和nonclustered索引的区别
  9. java mysql大小写_MySQL大小写敏感的解决方案
  10. Bailian2733 判断闰年【入门】(POJ NOI0104-17)
  11. Description Resource Path LocationType Java compiler level does not match the version of the instal
  12. [233]树莓派裸机代码bootloader学习总结
  13. 西门子PLC开发笔记(一):PLC介绍,西门子S1200系列接线、编程、下载和仿真
  14. 汽车变排量空调压缩机电磁阀故障诊断
  15. 阿里 P6 面试体验
  16. STL — 迭代器设计思维(一)
  17. 运筹学基础——库存管理
  18. 重庆12岁男孩大毛带着7岁半的弟弟小毛逃学,跑到山里呆了13天
  19. 亚马逊婴儿围栏CPC认证,ASTMF1004、ASTMF406、CPSIA测试标准办理
  20. logisim反应时间计时器设计

热门文章

  1. 推荐几个程序员赚钱的平台,你有技术就有钱!
  2. multisim仿真高通滤波器——光谱分析仪的使用
  3. Java 发送短信工具类
  4. oracle 新增字段 影响,Oracle 之 表新增字段后修改字段顺序
  5. Git Gui界面出现中文乱码的设置方法
  6. Java解决vue跨域问题
  7. Xcode隐藏SDK C、C++、Objective-C符号
  8. 时间和天数相加并格式化
  9. 复杂网络实验2:WS小世界模型(matlab)
  10. 微生物生态数据分析——冗余分析