实习知识整理11:确认订单并将订单的相关信息插入用户订单表和订单详情表

用户订单表:

 

订单详情表:

 

思路分析:首先我们需要知道当点击了确认订单按钮后,需要向后端传递哪些数据,先看用户订单表:ORDER_ID是不需要传的,这个可以在后台生成就行了;USER_ID是需要传的;ADDRESS_ID也是需要传的;ORDER_TIME可以在后台获得系统的时间,也是不需要传的;GET_TIME不需要;TOTAL总价是需要传的;NOTE备注也是需要传的。

再看订单详情表:ORDER_DETAIL_ID是自增的,不需要;ORDER_ID也是不需要的;ITEM_ID是需要的;BUY_COUNT也是需要的 

 

1. 提交表单需要传递的数据

补充:再上一篇博客中讲述了如何选择其他地址并渲染到页面上,此时我们在这边的,需要传递ADDRESS_ID, 所以当我们选择其他地址时,同时也是需要将ADDRESS_ID也跟着改变成相应的,不然提交表单时,会传错误的ADDRESS_ID

<input id="formAddressId" name="addressId" type="hidden" th:value="${defaultAddress.addressId}"/>

将需要传递的数据都放入表单中,如果不需要展示,直接设为隐藏就行了

 

 

 

 2. 后端接收数据并执行插入操作

我们需要向两个表中插入数据,所以要写两个mapper

UserOrderMapper.java 

public interface UserOrderMapper {// 新增订单信息int insertUserOrder(UserOrder userOrder);
}

UserOrderMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.shopping.mapper.UserOrderMapper"><resultMap id="userOrderBaseResultMap" type="UserOrder"><id column="ORDER_ID" property="orderId"/><result column="USER_ID" property="userId"/><result column="ADDRESS_ID" property="addressId"/><result column="ORDER_TIME" property="orderTime"/><result column="GET_TIME" property="getTime"/><result column="TOTAL" property="total"/><result column="NOTE" property="note"/></resultMap><!--insertUserOrder(UserOrder userOrder);--><insert id="insertUserOrder" parameterType="UserOrder">INSERT INTO userorder (ORDER_ID,USER_ID,ADDRESS_ID,ORDER_TIME,GET_TIME,TOTAL,NOTE)VALUES (#{orderId},#{userId},#{addressId},#{orderTime},#{getTime},#{total},#{note})</insert></mapper>

 OrderDetailMapper.java

public interface OrderDetailMapper {//插入订单详情int insertOrderDetail(OrderDetail orderDetail);
}

OrderDetailMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.shopping.mapper.OrderDetailMapper"><resultMap id="baseOrderDetailResultMap" type="Address"><id column="ORDER_DETAIL_ID" property="orderDetailId"/><result column="ORDER_ID" property="orderId"/><result column="ITEM_ID" property="itemId"/><result column="BUY_COUNT" property="buyCount"/></resultMap><!--insertOrderDetail(OrderDetail orderDetail);--><insert id="insertOrderDetail" parameterType="OrderDetail">INSERT INTO orderdetail (ORDER_ID,ITEM_ID,BUY_COUNT) VALUES (#{orderId},#{itemId},#{buyCount})</insert>
</mapper>

 

UserOrderService.java 接口

 使其的返回类型时ResultDTO

public interface UserOrderService {// 直接购买确认订单功能ResultDTO<UserOrder> confirmOrder(UserOrder userOrder, OrderDetail orderDetail);
}

 

 UserOrderServiceImpl.java 实现类

public class UserOrderServiceImpl implements UserOrderService {@ResourceUserOrderMapper userOrderMapper;@ResourceOrderDetailMapper orderDetailMapper;@Overridepublic ResultDTO<UserOrder> confirmOrder(UserOrder userOrder, OrderDetail orderDetail) {ResultDTO<UserOrder> userOrderResultDTO = new ResultDTO<>();// 判断用户是否登录if (0!= userOrder.getUserId()) {int orderId = (int)(Math.random() * 1234567890);  // 生成随机的订单编号userOrder.setOrderId(orderId);userOrder.setOrderTime(new Timestamp(System.currentTimeMillis()));  // 将当前系统的时间直接填入int orderSubmit = userOrderMapper.insertUserOrder(userOrder);if (orderSubmit > 0) {// 订单插入成功,才能进行订单详情插入orderDetail.setOrderId(orderId);int orderDetailSubmit = orderDetailMapper.insertOrderDetail(orderDetail);if (orderDetailSubmit > 0) {userOrderResultDTO.setCode(200);userOrderResultDTO.setMsg("下单成功!");userOrderResultDTO.setData(userOrder);} else {userOrderResultDTO.setCode(500);userOrderResultDTO.setMsg("下单失败!");userOrderResultDTO.setData(null);}}} else {userOrderResultDTO.setCode(500);userOrderResultDTO.setMsg("下单失败!");userOrderResultDTO.setData(null);}return userOrderResultDTO;}
}

UserOrderController.java

    @RequestMapping("/confirmOrder")@ResponseBody// http://localhost:8082/project/order/confirmOrderpublic ResultDTO confirmOrder(UserOrder userOrder, OrderDetail orderDetail) throws Exception {// System.out.println("userOrder:" + userOrder);// System.out.println("orderDetail:" + orderDetail);ResultDTO<UserOrder> confirmOrderResult =  userOrderService.confirmOrder(userOrder, orderDetail);return  confirmOrderResult;}

这边是直接以ResultDTO的形式返回的,也可以使用ModelAndView进行数据的返回

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go http升级为websocket举例

当使用 Go 语言编写 WebSocket 服务器时&#xff0c;可以使用 net/http 包来处理客户端的 HTTP 请求&#xff0c;并将其升级为 WebSocket 连接。以下是一个简单的示例代码&#xff1a; go package main import ( "fmt" "log" "net/http…

docker commit之后镜像越来越大解决办法

每次对docker的镜像进行增删改之后&#xff0c;它的体积都会扩充&#xff0c;甚至大到5G左右&#xff0c;在项目中是不可以接受的。 查找变大的原因为&#xff1a; docker容器就是以便于移植和部署著称。那么在docker使用过程中&#xff0c;少不了对容器进行反复的的打包和部署…

2023年12月GESP C++七级编程题转Python真题解析

七、2023年12月GESP C(Python)七级编程题 2023年12月GESP Python最高六级&#xff0c;但C与Python同级编程题相同。本篇引用2023年12月GESPC七级编程题&#xff0c;用Python实现。 【七级编程题1】 【试题名称】&#xff1a;商品交易 时间限制&#xff1a;1.0 s 内存限制&…

大数据系列之:读取parquet文件统计数据量

大数据系列之&#xff1a;读取parquet文件统计数据量 一、Spark读取parquet文件统计数据量二、parquet-tools统计parquet文件数据量三、实际应用案例 一、Spark读取parquet文件统计数据量 首先&#xff0c;创建一个 SparkSession 对象&#xff1a; val spark SparkSession.b…

微信公众号请求获取相关权限后端代码

用微信的东西&#xff0c;总要避免到各种与微信那边的交互。 1.首先要有个接口&#xff0c;证明你是服务端&#xff08;填写服务器配置&#xff09; 接入概述 | 微信开放文档 主代码 /*** 服务器配置验证* param* return*/PassTokenGetMapping("/giveWxCheck")publi…

详解Vue3中的事件监听方式

本文主要介绍Vue3中的事件监听方式。 目录 一、v-on指令二、使用符号简写三、事件修饰符四、动态事件名五、常见的监听事件六、自定义事件 在Vue3中&#xff0c;事件监听的方式与Vue2有一些不同。 下面是Vue3中事件监听方式的详细介绍&#xff1a; 一、v-on指令 Vue3中仍然使…

​LeetCode解法汇总2487. 从链表中移除节点

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个…

vue 使用 splice 删除元素UI视图不同步怎么办?

vue 使用 splice 删除元素UI视图不同步怎么办&#xff1f; https://www.zhihu.com/question/585036077?write#:~:text%E5%9C%A8Vue%E4%B8%AD%E4%BD%BF%E7%94%A8splice,%28%29%E6%96%B9%E6%B3%95%E5%88%A0%E9%99%A4%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E5%85%83%E7%B4%A0%E6%…

(PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测

目录 I. 前言II. TCNIII. TCN-RNN/LSTM/GRU3.1 TCN-RNN3.2 TCN-LSTM3.3 TCN-GRU IV. 实验结果 I. 前言 前面已经写了一系列有关LSTM时间序列预测的文章&#xff1a; 深入理解PyTorch中LSTM的输入和输出&#xff08;从input输入到Linear输出&#xff09;PyTorch搭建LSTM实现时…

算法训练第五十二天|300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

300. 最长递增子序列&#xff1a; 题目链接 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组…

Arduino驱动VL53L0X ToF激光测距传感器(距离传感器)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 VL53L0X激光测距传感器是一款基于意法半导体(STMicroelectronics&#

python实现简易的flask后端接口

先安装插件pip install flask 新建py脚本文件编码&#xff1a; # -*- coding: utf-8 -*- from flask import Flask from flask_cors import CORS # 跨域依赖&#xff0c;通过pip install flask-cors安装app Flask(__name__) cors CORS(app) # 跨域设置&#xff0c;这样设置…

WPF容器的背景对鼠标事件的影响

背景&#xff1a;在实现鼠标拖动窗口的过程中发现对父容器设置了鼠标拖动窗口的事件MouseLeftButtonDown private void DragWindow(object sender, MouseButtonEventArgs e) {if (e.LeftButton MouseButtonState.Pressed)DragMove(); } 问题&#xff1a;非常困惑的是&#x…

C# windows服务程序开机自启动exe程序

我们使用传统的Process.Start(".exe")启动进程会遇到无法打开UI界面的问题&#xff0c;尤其是我们需要进行开启自启动程序设置时出现诸多问题&#xff0c;于是我们就想到采用windows服务开机自启动来创建启动一个新的exe程序&#xff0c;并且是显式运行。 首先是打开…

软件测试入门(知识汇总)

1、黑盒测试、白盒测试、灰盒测试 1.1 黑盒测试 黑盒测试又叫功能测试、数据驱动测试 或 基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需求。 采用这种测试方法&#xff0c;测试工程师把测试对象看作一个黑盒子&#xff0c;完全不考虑程序内部的逻辑结构和…

clickhouseSQL日期相关

1. 毫秒级时间戳转日期/小时 --13位时间戳转具体时间 toDateTime(report_time / 1000) as _c00 -- 获取时间戳对应的时间点整点(结果&#xff1a;%Y-%m-%d %H:00:00.0) eg&#xff1a;2022-09-28 23:00:00.0 toStartOfHour(toDateTime(report_time / 1000)) AS _10-- 获取时间…

Rust使用gRPC

需要先安装protoc&#xff08;Protocol Buffers Compiler&#xff09;&#xff0c;可据此Protobuf Compiler Installation下载 第一步&#xff1a;创建项目 创建两个新的Rust项目&#xff0c;分别作为服务端与客户端&#xff1a; cargo new rust_grpc_servercargo new rust_grp…

简单的数组移动问题

https://leetcode.cn/problems/move-zeroes/?envTypestudy-plan-v2&envIdprogramming-skills 思路&#xff1a; 1.在原数组上直接操作&#xff0c;采用双指针的思想&#xff0c;每次移动r&#xff0c;当r不为0时交换num中的值 class Solution {public void moveZeroes(in…

超级解压馆帮助与支持

游戏目标&#xff1a; 将相同颜色的筹码移动到同一排&#xff0c;当一排筹码颜色相同并装满时&#xff0c;你可以合成新数字。挑战你的智力&#xff0c;看你能拼出的最大数字是多少&#xff01; 游戏玩法&#xff1a; 将相同颜色的数字币移动到相同颜色的数字币槽中。 观察所…

【操作系统习题】处理机调度与死锁

一、单选题 FCFS算法的就绪队列是按照进程的&#xff08;&#xff09;排列。 B A、等待时间 B、到达时间 C、响应时间 D、运行时间设有4个作业同时到达&#xff0c;每个作业的执行时间均为2个小时&#xff0c;它们在一台处理机上按单道方式执行&#xff0c;则平均周转时间为&a…