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

news2025/2/24 6:39:39

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)
        }

 

 

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

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

相关文章

第二十一章Java网络通信

网络通信这一章 基本分为三个部分 网络基础概念和TCP,UDP这三个部分主要如下&#xff1a; 计算机网络实现了堕胎计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#x…

【Unity动画系统】Unity动画系统Animation详解,参数细节你是否弄清?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

电子学会C/C++编程等级考试2023年03月(七级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:走出迷宫 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。 时间限制:1000 内存限制…

docker学习笔记03-持久化存储

1.docker架构 2.docker持续化存储-数据卷 //以后台方式运行容器 (推荐) docker run -d -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name容器名称 镜像ID/镜像名称[:版本号]执行下面命令 docker run -p 1122:3306 --name mysql99…

脆皮大学生“拯救”方案——智慧高校智能视频监控系统的建设

随着“脆皮大学生”的网络热梗爆火&#xff0c;大学生日常监管问题也浮出水面。虽然高校大学生作为成年人&#xff0c;可以对自己的日常行为进行自我约束&#xff0c;但由于大学生涉世未深&#xff0c;缺乏独立生活经验&#xff0c;社会关系简单&#xff0c;在校期间&#xff0…

嵌入式Linux:提升VMware虚拟机运行速度的方法

使用虚拟机运行Linux操作系统通常会比在物理机上直接安装系统的运行效率更低&#xff0c;本篇博文将介绍如何优化虚拟机的设置&#xff0c;进而提升虚拟机性能体验。 第1步&#xff1a;选择VMware菜单&#xff1a;编辑–>首选项–>更新&#xff0c;将”启动时检查产品更新…

为什么IDEA建议去掉StringBuilder,而要使用“+”拼接字符串

在字符串拼接时应该都见过下面这种提示&#xff1a; 大家普遍认知中&#xff0c;字符串拼接要用StringBuilder&#xff0c;那为什么idea会建议你是用呢&#xff0c;那到底StringBuilder和有什么具体区别呢&#xff0c;我们一起来探究一下。 普通拼接 普通的几个字符串拼接成一…

积极拥抱信创,思迈特软件与麒麟软件NeoCertify完成认证

近日&#xff0c;思迈特软件与麒麟软件有限公司进行了联合测试&#xff0c;并顺利完成产品兼容性测试。经评测&#xff0c;思迈特软件一站式大数据分析平台&#xff08;Smartbi Insight V11&#xff09;与银河麒麟高级服务器操作系统&#xff08;飞腾版&#xff09;V10、&#…

代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后 、37. 解数独

332.重新安排行程 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 文档讲解&#xff1a;代码随想录 C代码&#xff1a; class Solution { public: unordered_map<string, map<string, int>> targets;bool backtrack…

【Seata源码学习 】篇四 TM事务管理器是如何开启全局事务

TM发送 单个或批量 消息 以发送GlobalBeginRequest消息为例 TM在执行拦截器链路前将向TC发送GlobalBeginRequest 消息 io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String) Overridepublic String begin(String applicationId, String transactionServi…

一款降压型开关模式转换器解决方案

一、基本概述 TX4145 是一款降压型开关模式转换器。TX4145 在 6-60V 宽输入电源范围内实现不同峰值输出电流&#xff0c;并且具有出色的线电压和负载调整率。 TX4145 采用 PWM 电流模工作模式&#xff0c;环路易于稳定并提供快速的瞬态响应。 TX4145 外部提供 FS 脚&#xf…

[每周一更]-(第44期):GIT版本控制之忽略文件

基础概念 在 Git 中&#xff0c;可以通过 .gitignore 文件来指定不需要纳入版本控制的文件或文件夹&#xff0c;这些被忽略的文件或文件夹不会被提交到仓库中。 在项目根目录下创建一个名为 .gitignore 的文件&#xff0c;并在其中列出需要忽略的文件或文件夹。一些常见的示例…

java设计模式学习之【中介者模式】

文章目录 引言中介者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用聊天室示例代码地址 引言 想象一下一座忙碌的机场&#xff0c;各种飞机需要起飞、降落&#xff0c;而不同的飞行活动之间必须互不干扰。如果没有一个统一的控制系统&#xff0c;这将是一…

Vue ThreeJs实现银河系行星运动

预览 可通过右上角调整参数&#xff0c;进行光影练习 代码 <template><div id"body"></div> </template> <script>import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import …

FontsTest.java

package fonts;import java.awt.Font; import java.awt.GraphicsEnvironment;/*** Font测试* * 不同字体在不同操作系统是不一样的&#xff0c;更新* * linux&#xff1a; https://blog.csdn.net/spencer_tseng/article/details/135232675windows&#xff1a; https://blog.cs…

48道Linux面试题

本博客将汇总 Linux 面试中常见的题目&#xff0c;并提供详细的解答。 文章目录 1、绝对路径用什么[符号表](https://so.csdn.net/so/search?q符号表&spm1001.2101.3001.7020)示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命…

活动回顾 (下) | 机器学习系统趋势研判,大咖金句汇总

作者&#xff1a;三羊、李宝珠、李玮栋、Yudi、xixi 编辑&#xff1a;李宝珠 在大模型时代的浪潮中&#xff0c;机器学习系统正经历着前所未有的变革。模型规模的急剧膨胀&#xff0c;让我们见证了 AI 能力的巨大提升&#xff0c;然而这种提升不仅为各个领域带来了新的机遇&…

Java版企业电子招标采购系统源码——鸿鹄电子招投标系统的技术特点

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…

六、Redis 分布式系统

六、Redis 分布式系统 六、Redis 分布式系统6.1 数据分区算法6.1.1 顺序分区6.1.2 哈希分区 6.2 系统搭建与运行6.2.1 系统搭建6.2.2 系统启动与关闭 6.3 集群操作6.3.1 连接集群6.3.2 写入数据6.3.3 集群查询6.3.4 故障转移6.3.5 集群扩容6.3.6 集群收缩 6.4 分布式系统的限制…

两张图片沿着斜对角线合并成一张图片

在图像融合领域,论文中的对比算法可视化,需要将红外图像和可见光图像沿着斜对角线合并成一张图片。 红外与可见光图像举例: 然后做出这样的效果: 用Python的PIL库,将两张图片沿着斜对角线合并成一张图片。 from PIL import Image, ImageDraw# 两张图片的路径 image1_pat…