实习知识整理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]: undefined
                if (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 = 0
            for (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)
        }

 

 

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

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

相关文章

php 8.4 xdebug扩展编译安装方法

最新版php8.4 xdebug扩展只能通过编译方式安装, pecl是安装不了的, 编译方法如下 下载最新版xdebug git clone https://github.com/xdebug/xdebug.git 却换入xdebug目录执行编译安装xdebug cd xdebug phpize./configure --enable-xdebugmakemake install3. 配置启用xdebug 这…

关于java选择结构if和else详解

关于java选择结构if和else详解 在上篇文章中我们了解了java的基本流程控制之一用户交互&#xff0c;也讲述了scanner类的使用方式&#xff0c;本篇文章中我们来深入一下下一个java流程控制&#xff0c;if和else&#xff0c;这个是非常关键的&#xff0c;也是我们以后的工作中最…

Java-File:遍历目录下的所有文件

一个常用file工具类&#xff0c;用来扫描给定目录下的所有文件&#xff0c;返回对应文件的全路径。 public static ArrayList<Object> scanFilesWithSubPackage(String path) {ArrayList<Object> scanFiles new ArrayList<Object>();LinkedList<File>…

40G多模光模块QSFP-40G-SR4优势及应用领域介绍

QSFP-40G-SR4光模块是一种常用的光纤传输解决方案。传输速率40G&#xff0c;SR代表短距离多模光纤&#xff08;Short Range Multimode Fiber&#xff09;&#xff0c;4表示有四个光纤通道。这种光模块采用MPO/MTP多模光纤连接器来实现高速传输&#xff0c;传输距离可以达到300米…

骨传导耳机的原理是什么?一文读懂骨传导耳机优缺点都有哪些!

一、骨传导耳机传声原理是什么 骨传导耳机以人体骨骼为传声介质&#xff0c;可以将声音转化为不同频率的震动&#xff0c;在不经过外耳道和鼓膜的情况下&#xff0c;通过震动使声音经过内耳道&#xff0c;直接传入大脑听觉神经&#xff0c;与传统耳机相比&#xff0c;可以节省许…

【堡垒机小问答】堡垒机最早起源于哪里?是国外吗?

随着大家网络安全意识的增加&#xff0c;对于堡垒机的了解也越来越多。最近有不少小伙伴在问&#xff0c;堡垒机最早起源于哪里&#xff1f;是国外吗&#xff1f;这里我们就来简单回答一下。 堡垒机最早起源于哪里&#xff1f;是国外吗&#xff1f; 【回答】&#xff1a;堡垒…

关于“Python”的核心知识点整理大全49

目录 16.2.10 加亮颜色主题 16.3 小结 第&#xff11;7 章 使用API 17.1 使用 Web API 17.1.1 Git 和 GitHub 17.1.2 使用 API 调用请求数据 17.1.3 安装 requests 17.1.4 处理 API 响应 python_repos.py 注意 17.1.5 处理响应字典 python_repos.py import json i…

We are a team - 华为OD统一考试

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 总共有 n 个人在机房&#xff0c;每个人有一个标号 (1<标号<n) &#xff0c;他们分成了多个团队&#xff0c;需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中&#xff0c;具体的: 消息构成为 a b …

HMS SQL注入(CVE-2022-25491)

漏洞描述&#xff1a; 2022年3月15日&#xff0c;CVE收录了编号CVE-2022-25491漏洞&#xff0c;该漏洞为在HMS v1.0版本中存在SQL注入漏洞&#xff0c;该漏洞允许攻击者通过手动调试appointment.php文件中的editid软件参数进行SQL注入攻击。 复现过程&#xff1a; 1.访问ip&…

深入理解Golang:切片的底层机制解析

深入理解Golang&#xff1a;切片的底层机制解析 引言切片的基本概念切片的内部结构内存管理机制切片与数组的对比切片的高级用法性能优化建议案例研究 引言 在现代软件开发中&#xff0c;高效的数据处理和优化的内存管理是每位开发者都需面对的挑战。特别是在使用像Go语言&…

部署一款开源的网站监控工具—Uptime Kuma

项目介绍 项目地址&#xff1a;louislam/uptime-kuma: A fancy self-hosted monitoring tool (github.com) Uptime Kuma是一个开源的网络服务监控工具。它允许用户监视他们的网络服务&#xff0c;以确保其正常运行&#xff0c;并提供有关服务可用性和性能的实时信息。Uptime K…

R503S指纹识别模块的指令系统(一)

1.采集指纹图像 GetImage&#xff08;0x01&#xff09; 功能说明&#xff1a;探测手指&#xff0c;探测到后录入指纹图像存于 ImageBuffer&#xff0c;并返回录入成功确认码&#xff1b;若探测不到手指&#xff0c;直接返回无手指确认码(模块对于每一条指令都快速反应&#xf…

Go 语言如何读取 excel 测试数据,简单易学

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

微信小程序全部内嵌H5遇到的问题记录

微信小程序内嵌H5遇到的问题 问题1&#xff1a;js-sdk的配置h5里面微信公众平台 问题2&#xff1a;业务域名的配置小程序开发微信公众平台 问题3&#xff1a;H5与小程序的消息传递。方案1H5 方案2H5页面小程序开发 方案3H5页面小程序页面 使用H5来开发APP&#xff0c;之后将该H…

2023年度巨献,一图总结2023年最重要的AI相关的产品和技术~共48个产品或技术上榜

原文来自DataLearnerAI官方网站&#xff1a; 2023年度巨献&#xff0c;一图总结2023年最重要的AI相关的产品和技术~共48个产品或技术上榜 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703825548892 2022年11月底&#xff0c;ChatGPT横空出世&…

vue-cli3/webpack打包时去掉console.log调试信息

文章目录 前言一、terser-webpack-plugin是什么&#xff1f;二、使用配置vue-cli项目 前言 开发环境下&#xff0c;console.log调试信息&#xff0c;有助于我们找到错误&#xff0c;但在生产环境&#xff0c;不需要console.log打印调试信息&#xff0c;所以打包时需要将consol…

字节跳动内部泄露的前端学习笔记在互联网上大火,在Github标星33K+,完整版赶紧下载

一、入门前端三剑客 1、HTML html 学起来还是挺简单的&#xff0c;无论你是否有编程基础&#xff0c;我觉得都可以快速入门&#xff0c;对于新手&#xff0c;我推荐找个入门的视频看一下&#xff0c;然后跟着视频打代码就可以了&#xff0c;入门教程随便在网上找个免费的视频就…

神经网络:模型部署

【一】模型压缩的必要性与可行性&#xff1f; 模型压缩是指对算法模型进行精简&#xff0c;进而得到一个轻量且性能相当的小模型&#xff0c;压缩后的模型具有更小的结构和更少的参数&#xff0c;可以有效降低计算和存储开销&#xff0c;便于部署在端侧设备中。 随着AI技术的…

浮点数表示法以及相关“小”知识点

浮点数的表示形式 小数点的位置是浮动的。 任意一个二进制数N可 以表示成&#xff1a;N&#xff1d;Sr^j 其中&#xff0c;S为尾数(可正可负)&#xff0c;r为基数(数值)&#xff0c;j是阶码(可正可负)。 1、对一个真值为23.25的十进制数&#xff0c;用浮点数格式表示其原码。 …

C语言——小细节和小知识7

一、逆序字符串 1、递归1 #include <stdio.h> #include <string.h>void ReverseArray(char *str) {char temp *str;//1int len (int)strlen(str);*str *(str len - 1);//2*(str len - 1) \0;//3if(strlen(str 1) > 2)//只要字符串还大于2&#xff0c;就…