实习知识整理12:点击购物车渲染出购物车中的商品并实现在购物车界面对商品价格和数量的相关操作

1. 点击购物车渲染出购物车商品界面

通过userId从购物车表中查找商品的相关信息

前端:需要向后端传递userId 

 

后端:

CartMapper.java 

 

CartMapper.xml 

 

CartService.java 接口

 

CartServiceImpl.java 实现类 

CartController.java 

 

cartIndex.html页面 

遍历渲染出相关信息

<form action="http://localhost:8082/project/cart/submitCart" method="post"><table><tr><td>请选择</td><td>商品名称</td><td>商品价格</td><td>数量</td><td>总价</td><td>操作</td></tr><tr th:each="cartItem:${cartList}"><td><input type="checkbox" name="checkCartId" th:id="'checkCartId_'+${cartItemStat.index}+'_id'"th:value="${cartItem.cartId}" th:onchange="'changeCheckBox(' + ${cartItemStat.index} + ')'"/><!--以下实际上 是将name定义为 cartList[0].cartId  cartList[1].cartId--><input th:name="'cartList['+${cartItemStat.index}+'].cartId'" type="hidden" id="cartId"th:value="${cartItem.cartId}"/></td><td><input th:name="'cartList['+${cartItemStat.index}+'].itemName'" type="text" id="itemName"th:value="${cartItem.itemName}"/><input th:name="'cartList['+${cartItemStat.index}+'].itemId'" type="hidden" id="itemId"th:value="${cartItem.itemId}"/></td><td><input th:name="'cartList['+${cartItemStat.index}+'].itemSalePrice'" type="text" th:id="'cartList_'+${cartItemStat.index}+'_itemSalePrice'"th:value="${cartItem.itemSalePrice}" readonly/></td><td><input th:name="'cartList['+${cartItemStat.index}+'].buyCount'" type="number" min="1" th:id="'cartList_'+${cartItemStat.index}+'_buyCount'"th:value="${cartItem.buyCount}" th:onchange="'changeBuyCount('+${cartItemStat.index}+')'"/></td><td><input th:name="'cartList['+${cartItemStat.index}+'].total'" type="text" th:id="'cartList_'+${cartItemStat.index}+'_total'"th:value="${cartItem.buyCount * cartItem.itemSalePrice}"/></td><td><a th:href="'http://localhost:8082/project/delCartByCartId/' + ${cartItem.cartId}" style="text-decoration-line: none">删除该商品</a></td></tr></table><span>当前总价:</span><input id="currentTotal" value="0" readonly/><input type="submit" value="下单"/></form>

 注意这边name和id的命名写法(使用动态拼接的写法)

这样写的话,便于后续获取到具体的input中的内容,利于实现价格随着数量的变化而变化以及实现总价的计算,也有利于后续向订单确认界面传递数据

 

2. 实现在购物车界面对商品价格和数量的相关操作

 购物车的界面如下:

 

(1). 需要实现数量变化的同时,其对应的总价也跟着变化

需要为数量绑定一个监听变化的函数,以当前的索引号作为参数

 

changeBuyCount()函数 

        function changeBuyCount(index) {const totalId = '#cartList_'+index+'_total'const buyCount = '#cartList_'+index+'_buyCount'const itemSalePrice = '#cartList_'+index+'_itemSalePrice'const total = $(buyCount).val() * $(itemSalePrice).val()$(totalId).val(total)}

此时便可以实现动态变化了 

(2). 又需要实现当选中或取消选中一个商品时,需要支付的总价格可以动态变化

 首先需要监听checkbox是否被选择

        // 改变选择框// 变量未赋值:当一个变量被声明但没有被赋值时,它的默认值就是undefined。通过检查变量是否等于undefined,可以确定该变量是否已经赋值function changeCheckBox(index) {console.log(index)  // 点击的复选框的索引号for (let i=0; i<=index; i++) {console.log("flag:" + checkFlag[index])      // checkFlag[index]: undefinedif (undefined===checkFlag[index] && i===index) {checkFlag[index]  = true  //如果当前元素的值为 undefined,并且当前索引与传入的索引号相同,将该元素设为 true,表示选中状态。} else if (undefined===checkFlag[index] && i!==index) {checkFlag[index] = false  //如果当前元素的值为 undefined,并且当前索引与传入的索引号不同,将该元素设为 false,表示未选中状态。} else if(i===index) {checkFlag[index] = !checkFlag[index]  //如果当前索引与传入的索引号相同,将该元素的值取反,即切换选择状态。}}}

更新总价 

        // 更新所有选中商品的总价function changeCurrentTotal() {let currentTotal = 0for (let i = 0; i < checkFlag.length; i++) {if (checkFlag[i]) {const itemTotalId = '#cartList_'+i+'_total'const itemTotal = parseFloat($(itemTotalId).val())currentTotal += itemTotal}}console.log(checkFlag)console.log(currentTotal)$('#currentTotal').val(currentTotal)}

 

 

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

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

相关文章

使用自带密钥 (BYOK) 的Azure信息保护云退出

上篇我们讲了使用Microsoft托管密钥的Azure信息保护云退出&#xff0c;本文我们将介绍使用自带密钥 (BYOK) 的Azure信息保护云退出。 自带密钥 (BYOK) 由客户在 nCipher HSM 中创建&#xff0c;并安全地传输到基于 HSM 的 Azure Key Vault&#xff0c;供 AIP 使用。 由于 Micro…

【产品评测】戴尔G15 5510笔记本电脑拆机实拍

笔者最近入手了一台戴尔G15 5510笔记本电脑&#xff0c;第一时间将其初步拆解&#xff0c;了解其内部设计、构造和扩展性。 一、机身总览 1、屏幕和键盘 2、A面 略粗糙的手感。 3、D面 D面共有8颗螺丝&#xff0c;其中4颗&#xff08;上有保护膜&#xff09;为戴尔家比较常见…

创建型设计模式 - 抽象工厂模式 - JAVA

创建型设计模式 - 抽象工厂设计模式 一. 简介二. 列子2.1 定义电脑的抽象类和子类2.2 定义抽象工厂类和其实现类2.3 测试 三. 抽象工厂设计模式的好处四. 抽象工厂模式的案例 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续…

实时交通标志检测和分类(代码)

交通标志检测和分类技术是一种基于计算机视觉和深度学习的先进技术&#xff0c;能够识别道路上的各种交通标志&#xff0c;并对其进行分类和识别。这项技术在智能交通系统、自动驾驶汽车和交通安全管理领域具有重要的应用前景。下面我将结合实时交通标志检测和分类的重要性、技…

Java技术栈 —— Redis的雪崩、穿透与击穿

Java技术栈 —— Redis的雪崩、穿透与击穿 〇、实验的先导条件&#xff08;NginxJmeter&#xff09;一、Redis缓存雪崩、缓存穿透、缓存击穿1.1 雪崩1.2 穿透1.3 击穿 二、Redis应用场景——高并发2.1 单机部署的高并发问题与解决&#xff08;JVM级别锁&#xff09;2.2 集群部署…

简述Redis备份策略以及对应的实现机制

引言 Redis作为高性能的内存数据库&#xff0c;数据的安全性至关重要。一旦数据丢失&#xff0c;可能会对业务造成重大影响。因此&#xff0c;备份Redis数据是每个Redis使用者都必须考虑的问题。本文将介绍Redis的备份策略以及对应的实现机制。 一、备份策略 1.1 定期备份 …

【零基础入门VUE】VueJS - 实例

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门VUE专栏https://blog.csdn.net/arthas777/category_12537076.html 目录 句法 vue_instance.js 输出 例子 输出 实施例1 实施例2 例子 例子 要开始使用 VueJS&#xff0c;我们需要创建 Vue 实例&#xf…

神经网络常用模型总结

本文目录&#xff1a; 【一】目标检测中IOU的相关概念与计算【二】目标检测中NMS的相关概念与计算【三】One-stage目标检测与Two-stage目标检测的区别&#xff1f;【四】哪些方法可以提升小目标检测的效果&#xff1f;【五】ResNet模型的特点以及解决的问题&#xff1f;【六】R…

【C语言】数据结构——排序(一)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;数组打印与交换1. 插入排序1.1 直接插入排序1.1.1 基本思想1.1.2 实现代码1.1.3 图解 1.2 希尔排序1.2.1…

刺猬目标检测数据集VOC格式500张

刺猬是一种可爱的小型哺乳动物&#xff0c;被广泛分布在欧洲、亚洲、非洲和新西兰等地的草地、森林、灌木丛以及城市郊区等地方。刺猬的身体被短而密的刺毛所覆盖&#xff0c;这些刺毛是其最具特征性的外观特征&#xff0c;也是为了自我保护而设计的武器。 刺猬主要以昆虫、蠕…

手机/平板实现电脑第三屏-记录极简

软件&#xff1a; 手机 平板 : moonlight 电脑&#xff1a; 1 KtzeAbyss/Easy-Virtual-Display 2 Parsec Virtual Display Driver https://builds.parsec.app/vdd/parsec-vdd-0.38.0.0.exe 3 LizardByte/Sunshine: Self-hosted game stream host for Moonlight. (gith…

鸿蒙原生应用再添新丁!搜狐集团、航旅纵横入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;搜狐集团、航旅纵横入局鸿蒙 来自 HarmonyOS 微博12月28日消息&#xff0c;搜狐集团宣布与华为达成全面合作&#xff01;搜狐新闻近期将完成#鸿蒙原生应用#核心功能版本&#xff0c;搜狐视频也启动了#鸿蒙原生应用#开发&#xff01;这不仅是一…