【SpringBoot开发】之商城项目案例(订单及订单项生成)

  🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁


前言

        在上一期的博客中我们实现了购物车的全选全不选、单个删除以及删除所选中的商品,还有选中相应的商品进行对应的商品件数及总价的计算。本期的博客是基于上期的博客进行订单及订单项的生成。

一、订单及订单项的生成

1. 订单页面的数据绑定

        首先设置点击结算的点击事件,我们在cart.js中进行编写其函数方法

// 	设置结算的点击事件
	$(".count").click(function (){
		      // 	获取所有选中的商品ID
			// 	获取所有选中的商品ID
		let ids=[]
		// 遍历所有的行
		$(".th").each((i,ele)=>{
			// 	判断元素是否选中
			let f=$(ele).find('input[type="checkbox"]').prop("checked")
			//
			if (f) {//选中
				let id= $(ele).find('.mynum').attr('data-gid')//获取选中的商品id
				//将Id放入数组中
				ids.push(id)
			}
		})
		// 判断
		if (ids.length==0){
			alert("请选择要结算的商品")
		}else{
		// 	将ids转换为数组的格式
			ids=ids.join(",")
			// 跳转订单页面
			location.href='/cart/toOrder?ids='+ids

		}
	})

        我们传递的过来的购物车id首先要到缓存中去获取其商品id,再用商品id进行从数据库获取商品信息进行传输,因此我们在Redis的相关接口红编写一个方法根据id的数组获取

        在控制层编写对应的请求方法,有一点要注意因为我们前端传递过来的是字符串id,我们要对其进行截取并且将其转成集合的形式方便我们后续的传参。 

         最后是我们运行代码进行效果测试

        这样我们从购物车进行结算的商品成功绑定在其的页面上了。 

 2. 点击去支付生成订单

        首先我们新建一个Order.js用于编写前端的一些点击事件以及一些获取页面的参数传递到后台

 order.js

//设置点击去支付的点击事件
$(".pay").click(function (){
//   接下来获取的请求参数
//     获取到收货地址的元素框
    let el= $(".addres").find(".on");

    let person= el.find(".tit .fl").text();//收货人
    let address=el.find(".addCon p:first-child").text()//收货地址
    let telephone=el.find(".addCon p:first-child").text()//电话号码
    let pay=$(".way .on").attr('value');//获取支付方式
    let mail=$(".dis .on").text();//获取快递方式
    let ids= $(this).attr('data-ids')//获取购物车传递来的商品id
//     将参数打成一个对象
    let order={
        person,address,telephone,pay,mail,ids
    }
    $.post('/order/add',order,resp=>{
        if(resp.code===200){
            alert("添加订单成功,待支付!!!");
        }
    })

    console.log(order)


})

        当然在前面的按钮元素标签上携带商品id字符串参数,并且我还将默认地址字段的标签去除了否则会干扰我们的参数获取,当然不去除亦可以,自己更改参数的获取方式

        在后端编对应的接口方法 ,参数接受类以及请求方法

 OrderVo.java
package com.yx.yxshop.vo;

import com.yx.yxshop.pojo.Order;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * com.yx.yxshop.vo
 *
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create 2024/1/3
 * 订单接受参数类
 */
@Data//get/set
@AllArgsConstructor//有参
@NoArgsConstructor//无参
public class OrderVo extends Order implements Serializable {

//    商品id字符串
    private String ids;

}

         记得将Order实体中的时间类型改为Date类型

         我们在Redis的接口类以及接口实现类编写了一个方法用于当我们点击去支付后,在缓存中去除购物车中对应的商品信息。

 

        最后我们在编写我们的请求方法 

 OrderController.java
package com.yx.yxshop.controller;

import com.github.yitter.idgen.YitIdHelper;
import com.yx.yxshop.pojo.Goods;
import com.yx.yxshop.pojo.Order;
import com.yx.yxshop.pojo.OrderItem;
import com.yx.yxshop.pojo.User;
import com.yx.yxshop.resp.JsonResponseBody;
import com.yx.yxshop.service.IGoodsService;
import com.yx.yxshop.service.IOrderItemService;
import com.yx.yxshop.service.IOrderService;
import com.yx.yxshop.service.IRedisService;
import com.yx.yxshop.vo.CartVo;
import com.yx.yxshop.vo.OrderVo;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * <p>
 * 订单信息表 前端控制器
 * </p>
 *
 * @author yangxin
 * @since 2023-12-27
 */
@RestController
@RequestMapping("/order")
public class OrderController {

//    引入对应接口
    @Autowired
    private IRedisService redisService;
    @Autowired
    private IGoodsService goodsService;
    @Autowired
    private IOrderItemService orderItemService;
    @Autowired
    private IOrderService orderService;

    /**
     * 跳转订单的请求方法
     * @return
     */
    @RequestMapping("/add")
    public JsonResponseBody<?> toOrder(User user, OrderVo orderVo){
//        获取购物车商品id字符串
        String ids = orderVo.getIds();
//        从缓存中获取购物车商品信息   此时只有id和数量
        List<CartVo> cartitems = redisService.loadCart(user, ids);
        //        从数据库中获取商品信息
        //        获取到所选中商品的Id集合
        List<Long> gds = cartitems.stream().map(CartVo::getGid).collect(Collectors.toList());
//      根据集合查询对应的商品信息
        List<Goods> goods = goodsService.listByIds(gds);
//      遍历结合赋值给对应的选项
        for (Goods g : goods) {
//            根据商品Id查询对应的购物车选项
            CartVo cartVo = cartitems.stream().filter(v -> Objects.equals(v.getGid(), g.getGid()))
                    .findFirst()
                    .get();
//            商品g的属性赋值给vo
            BeanUtils.copyProperties(g,cartVo);
        }
//          使用雪花id生成订单id
        long oid = YitIdHelper.nextId();//订单id
//        定义一个变量计算总价
        BigDecimal total = new BigDecimal("0");
//        增加订单项
//        实例化一个集合
        List<OrderItem> orderItems = new ArrayList<>();//用户后续插入数据
//        遍历商品信息集合
        for (CartVo item : cartitems) {
//            生成订单项
//            实例化一个订单项
            OrderItem orderItem = new OrderItem();
//              赋值属性
            BeanUtils.copyProperties(item,orderItem);
//            订单项的订单商品数量
            orderItem.setQuantity(item.getNum());
            orderItem.setOoid(YitIdHelper.nextId());//订单项id
            orderItem.setOid(oid);//订单id
//            订单对象存放到订单集合中
//              减少请求生成
            orderItems.add(orderItem);
//            计算总价
            total = total.add(item.sumprice());

        }
//        向数据库中批量插入数据
        orderItemService.saveBatch(orderItems,5);//分批插入防止数据量过多
//        增加订单
//        实例化订单对象
        Order order = new Order();
//        设置订单属性
        BeanUtils.copyProperties(orderVo,order);
//      设置总价
        order.setTotal(total);
//        设置用户id
        order.setUserId(user.getId());
//        设置订单状态  默认0
        order.setStatus(0);
//      设置创建时间
        order.setCreateDate(new Date());
//      将订单插入数据库
        orderService.save(order);
//        删除缓存中购物车对应的商品
        redisService.removeCart(user,orderVo.getIds());
        return JsonResponseBody.success();
    }


}

3. 代码测试

         数据库对应的表也生成了数据

 🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路 !🎁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系列--装饰器

一、基础UI组件结构 每个UI组件需要定义为Component struct对象&#xff0c;其内部必须包含一个且只能包含一个build(){}函数&#xff0c;用于绘制UI&#xff1b;struct之内、build()函数之外的地方用于存放数据。 二、基本UI装饰器 Entry 装饰struct&#xff0c;页面的入口…

系列十、Spring Cloud Gateway

一、Spring Cloud Gateway 1.1、概述 Spring Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中采用的是Zuul网关&#xff0c;但是在2.x版本中&#xff0c;由于Zuul的升级一直跳票&#xff0c;Spring Cloud最后自己研发了一个网关替代Zuul&#xff0c;即&#xf…

2020年认证杯SPSSPRO杯数学建模B题(第二阶段)分布式无线广播全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 B题 分布式无线广播 原题再现&#xff1a; 以广播的方式来进行无线网通信&#xff0c;必须解决发送互相冲突的问题。无线网的许多基础通信协议都使用了令牌的方法来解决这个问题&#xff0c;在同一个时间段内&#xff0c;只有唯一一个拿到令牌…

Unity 2022 版本 寻路 NavMesh

官方教程地址 https://docs.unity3d.com/Packages/com.unity.ai.navigation1.1/manual/index.html 首先装包 先给地图 和 阻挡 设置为静态 然后给地上行走的地方 添加组件 可以直接bake 然后会显示蓝色的可行走路径 player 添加插件 然后给角色添加脚本 using System.Co…

MySQL基础篇(一)SQL

视频地址: 黑马程序员 MySQL数据库入门到精通&#xff0c;从mysql安装到mysql高级、mysql优化全囊括 SQL&#xff0c;全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一 标准。 一、SQL通用语…

ImportError: DLL load failed while importing imaging: 找不到指定的模块

24.1 ImportError: DLL load failed while importing imaging: 找不到指定的模块 参考&#xff1a;https://zhuanlan.zhihu.com/p/662305030?utm_id0 说明&#xff1a;Pillow 与pillow都可以&#xff0c;不区分首字母大小写 第一步&#xff1a;查看是否有pillow 1&#xff09;…

AI:117-基于机器学习的环境污染影响评估

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

vue3+Ts+Hook的方式实现商城核心功能sku选择器

前言 Hooks是React等函数式编程框架中非常受欢迎的工具&#xff0c;随着VUE3 Composition API 函数式编程风格的推出&#xff0c;现在也受到越来越多VUE3开发者的青睐&#xff0c;它让开发者的代码具有更高的复用度且更加清晰、易于维护。 本文将通过CRMEB商城商品详情sku选择…

【完整思路】2023 年中国高校大数据挑战赛 赛题 B DNA 存储中的序列聚类与比对

2023 年中国高校大数据挑战赛 赛题 B DNA 存储中的序列聚类与比对 任务 1.错误率和拷贝数分析&#xff1a;分析“train_reads.txt”和“train_reference.txt”数据集中的错误率&#xff08;插入、删除、替换、链断裂&#xff09;和序列拷贝数。 2.聚类模型开发&#xff1a;开发…

Vue3+TS+ElementPlus的安装和使用教程【详细讲解】

前言 本文简单的介绍一下vue3框架的搭建和有关vue3技术栈的使用。通过本文学习我们可以自己独立搭建一个简单项目和vue3的实战。 随着前端的日月更新&#xff0c;技术的不断迭代提高&#xff0c;如今新vue项目首选用vue3 typescript vite pinia……模式。以前我们通常使用…

【教学类-43-15】 20240103 (5宫格数独:内存数据不够计算) 不重复的基础模板数量:未知

背景需求&#xff1a; 测试5宫格有多少种不重复的基础模板&#xff08;只测试所有的25数字一组有多少个&#xff09; # 测试11*11格&#xff0c;2*2一共4套3*3 宫格目的&#xff1a;数独14 5宫格有不同的基础模板 作者&#xff1a;阿夏 时间&#xff1a;2024年01月04日 13:…

【Echarts实践案例】如何在线图上标记一个非轴线上的点

需求背景&#xff1a; 当前有一个趋势图&#xff0c;横坐标表示灯泡平均使用时长&#xff0c;纵坐标表示灯泡平均使用温度。现在需要在当前坐标系下标记一个正在使用中的灯泡的时长及温度&#xff08;趋势图表示的是计算出的平均温度&#xff0c;所以当前灯泡的温度可能不会在…

算法导论复习——CHP22 基本图算法

图的表示 邻接矩阵和邻接表 稀疏图一般用邻接表表示&#xff08;稀疏图&#xff1a;边数|E|远小于的图 &#xff09; 稠密图更倾向于用邻接矩阵表示 (稠密图&#xff1a;边数|E|接近的图) 邻接矩阵可用于需要快速判断任意两个结点之间是否有边相连的应用场景。 如果用邻…

纯前端上传word,xlsx,ppt,在前端预览并下载成图片(预览效果可以,下载图片效果不太理想)

纯前端上传word,xlsx,ppt,在前端预览并下载成图片&#xff08;预览效果可以&#xff0c;下载图片效果不太理想&#xff09; 一.安装依赖二、主要代码 预览效果链接: https://github.com/501351981/vue-office 插件文档链接: https://501351981.github.io/vue-office/examples/d…

使用(?<!pattern) 负向后行断言正则表达式提取一个双引号开头和结尾的字符串

如下是一段java代码&#xff0c;我想用正则表达从中提取代码中的字符串 cond_buffer.append(" ORDER BY \"name\" \"").append(join(order_by_column,"\","));java是通过前后用双引号包含定义字符串的。但简单使用正则表达式".…

Kubernetes Gateway API V1.0:您应该切换吗?

自Kubernetes Gateway API 发布 v1.0以来已经过去两个多月了&#xff0c;这标志着其一些关键 API 已经进入普遍可用状态。 去年&#xff0c;当网关 API升级为测试版时&#xff0c;我曾写过有关该 API的文章&#xff0c;但一年后&#xff0c;问题仍然存在。您是否应该从 Ingres…

Python----matplotlib库

目录 plt库的字体&#xff1a; plt的操作绘图函数&#xff1a; plt.figure(figsizeNone, facecolorNone): plt.subplot(nrows, ncols, plot_number)&#xff1a; plt.axes(rect)&#xff1a; plt.subplots_adjust(): plt的读取和显示相关函数&#xff1a; plt库的基础图…

Python内置类属性__module__属性的使用教程

概要 在Python中&#xff0c;每个对象都有一些内置的属性&#xff0c;这些属性提供了有关对象的一些信息。其中一个内置属性是__module__属性。__module__属性是一个字符串&#xff0c;它表示定义了类或函数的模块的名称。在本篇文章中&#xff0c;我们将详细介绍__module__属…

随机森林,Random Forests Classifiers/Regressor

目录 介绍&#xff1a; 一、 Random Forests Classifiers&#xff08;离散型&#xff09; 1.1 数据处理 1.2建模 1.3特征值权值分析 1.4 特征值的缩减 二、Random Forests Regressor&#xff08;连续型&#xff09; 2.1数据处理 2.2建模 2.3调参 介绍&#xff1a; …

数据库:基础SQL知识+SQL实验1

&#xff08;1&#xff09;基础知识&#xff1a; 1.创建数据库&#xff1a; CREATE DATABASE <database_name> 2.删除数据库&#xff1a; DROP DATABASE <database_name> 3.相关数据类型&#xff1a; [1] 字符串类型 CHAR(n)&#xff1a;固定长度的字符数据…