实习知识整理8:如何实现将商品加入购物车

情景分析:当我们进入商品详情页面时,一般会有两个按钮,一个是加入购物车,另一个是直接购买的按钮,我们先来看看加入购物车是如何实现的

1. 数据库表分析

需要3个表:商品表item、用户表user、购物车表cart

需要将商品信息item表和用户表绑定,生成购物车信息,同时添加到购物车信息表中

购物车表:(需要向后端传递这些字段信息)

2.  前端页面代码

            <div>
                <form id="buyItemForm" action="http://localhost:8082/project/order/toConfirmOrder" method="post">
                    <!--有些关键数据,不需要用户填写,但是后面功能需要,可以使用hidden的input 传递-->
                    <input type="hidden" name="itemId" th:value="${item.itemId}"/>
                    <input type="hidden" name="itemName" th:value="${item.itemName}"/>
                    <input type="hidden" name="itemDesc" th:value="${item.itemDesc}"/>
                    <input type="hidden" name="itemImageMain" th:value="${item.itemImageMain}"/>
                    <!--单价和购买数量    可以计算订单的总价-->
                    <input type="hidden" name="itemSalePrice" th:value="${item.itemSalePrice}"/>
                    <span>购买数量</span><input type="text" id="buyCount" name="buyCount" value="1"/><br/>

                    <button id="buyButton">直接购买</button><br/>
                </form>

                <!--实际上将商品信息、购买数量、用户信息等获取到,在后台能够插入到数据库-->
                <button id="addCartButton">加入购物车</button><br/>
            </div>

1.为按钮添加点击事件,此时需要获取当前页面item的相关信息,以及所购买的数量,同时调用ajax将信息传递到后端 ,前后端的信息都是以json格式

     <script th:inline="javascript">
      
            // 添加到购物车
            $("#addCartButton").click(function () {
                const item = [[${item}]]
                console.log("item: ",item)
                const buyCount = $("#buyCount").val()
                const cart = {"userId": loginUser.userId, "itemId":item.itemId,
                    "buyCount": buyCount, "itemSalePrice": item.itemSalePrice,
                    "itemName": item.itemName}
                console.log("cart:", cart)
                const jsonCart = JSON.stringify(cart)  // 将object对象转换为json格式

                // 前后端都用json
                $.ajax({
                    type:"post",
                    url:"http://localhost:8082/project/cart/addCart",
                    contentType:"application/json;charset=utf-8",//指定前台向后台传递数据类型  json格式
                    dataType:'json',//指定后台返回前台的结果类型
                    data: jsonCart,
                    success:function (data) {//回调方法
                        if ('addSuccess' == data.msg) {
                            alert("加入购物车成功!")
                        } else if('updateSuccess' == data.msg) {
                            alert("更新购物车成功!")
                        } else {
                            alert("加入购物车失败!")
                        }
                    },
                    error:function (e) {
                        console.log(e);
                        console.log("通讯失败");
                    }
                });
            })

        })
        
    </script>

 

3. 后端接收到数据并进行相应的处理

CartMapper.java

    // 添加商品到购物车
    int addCart(Cart cart);

CartMapper.xml

    <insert id="addCart" parameterType="cart">
        INSERT INTO cart (USER_ID,ITEM_ID,BUY_COUNT,ITEM_SALE_PRICE,ITEM_NAME)
        VALUES(#{userId},#{itemId},#{buyCount},#{itemSalePrice},#{itemName})
    </insert>

CartService.java

    // 添加商品到购物车
    ResultDTO<Cart> addCart(Cart cart);   // 这边以ResultDTO作为返回的类型

CartServiceImpl.java

     public ResultDTO<Cart> addCart(Cart cart) {
            ResultDTO<Cart> addCartResult = new ResultDTO<>();
            int result = cartMapper.addCart(cart);
            
            if (result > 0){
                addCartResult.setMsg("addSuccess");
                addCartResult.setCode(2000);
                // 如果该业务逻辑需要传递数据,可以再处理
            } else {
                addCartResult.setMsg("fail");
                addCartResult.setCode(5000);
            }

        return addCartResult;
    }

CastController.java

    @PostMapping("/addCart")
    @ResponseBody
    ResultDTO<Cart> addCart(@RequestBody Cart cart) throws Exception{
        return cartService.addCart(cart);
    }

 

 前端再根据返回值提示相应的信息

 

 通过以上的操作已经可以实现向购物车中添加商品的操作了,但是又一个瑕疵的地方:

        比如用上述的方法,如果某一个人再同一家商店购买的商品,购买了两次,购物车中将会出现两条信息。这是不太好的。其实我们可以看看taobao就明白了

 

4. 完善 

解决上述出现的问题

1. 当点击加入购物车按钮后,前台会将userId和itemId等一系列信息传到后台,后台接收到信息后,可以根据 userId和itemId 进行查询 ,通过查询的结果来判断,如果存在则更新,不存在则新增

(1)所以我们需要补两个方法:

CartMapper.java

    // 更新购物车信息
    int updateCart(Cart cart);

    // 根据购物车中用户编号和商品编号查询购物记录是否存在
    Cart selectCartByUserIdAndItemId(Cart cart);

 

CartMapper.xml

    <update id="updateCart" parameterType="cart">
        UPDATE cart SET BUY_COUNT=#{buyCount} WHERE CART_ID=#{cartId}
    </update>

    <select id="selectCartByUserIdAndItemId" resultMap="baseCartResultMap" parameterType="cart">
        SELECT CART_ID,USER_ID,ITEM_ID,ITEM_NAME,ITEM_SALE_PRICE,BUY_COUNT FROM cart
        WHERE USER_ID=#{userId} AND ITEM_ID=#{itemId}
    </select>

CartService.java

    // 更新购物车信息
    boolean updateCart(Cart cart);

    // 根据购物车中用户编号和商品编号查询购物记录是否存在,
    // 存在则更新操作; 不存在则添加操作
    Cart selectCartByUserIdAndItemId(Cart cart);

 

 CartServiceImpl.java

    @Override
    public boolean updateCart(Cart cart) {
        Cart oldCart = selectCartByUserIdAndItemId(cart); // 将原有的购物车信息查询到
        System.out.println("oldCart:" + oldCart);
        int newBuyCount = cart.getBuyCount() + oldCart.getBuyCount(); // 将原纪录的数量加上新的购物数量
        cart.setBuyCount(newBuyCount); // 重新构造购买数量
        cart.setCartId(oldCart.getCartId()); // 将查询到的购物车的记录编号放入
        int updateResult = cartMapper.updateCart(cart);
        if (updateResult > 0) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Cart selectCartByUserIdAndItemId(Cart cart) {
        return cartMapper.selectCartByUserIdAndItemId(cart);
    }

 

 

修改addCart()方法

    @Override
    public ResultDTO<Cart> addCart(Cart cart) {
        ResultDTO<Cart> addCartResult = new ResultDTO<>();
        Cart oldCartRecord = selectCartByUserIdAndItemId(cart); // 查询该购物记录是否存在
        // 如果同一个用户购买商品同一家的同一类商品,则更新操作
        if (oldCartRecord == null){
            System.out.println("购物车无该商品");
            int result = cartMapper.addCart(cart);
            if (result > 0){
                addCartResult.setMsg("addSuccess");
                addCartResult.setCode(2000);
                // 如果该业务逻辑需要传递数据,可以再处理
            } else {
                addCartResult.setMsg("fail");
                addCartResult.setCode(5000);
            }
        } else {
            boolean updateResult = updateCart(cart);
            if (updateResult) {
                addCartResult.setMsg("updateSuccess");
            } else {
                addCartResult.setMsg("updateFail");
            }
        }

        return addCartResult;
    }

 

前端再进行相应处理

 

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

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

相关文章

基于JAVA的医院门诊预约挂号系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

Autosar CAN开发05(从实际应用认识CAN波特率)

建议同时阅读本专栏的&#xff1a; Autosar CAN开发03&#xff08;从实际应用认识CAN总线的物理层&#xff09; Autosar CAN开发04&#xff08;从实际应用认识CAN报文&#xff09; Autosar CAN开发05&#xff08;从实际应用认识CAN波特率&#xff09; 前言 当知道了CAN的物…

STM32MP157D-DK1开发板Qt镜像构建

上篇介绍了STM32MP57-DK1开发板官方系统的烧录。那个系统包含Linux系统的基础功能&#xff0c;如果要进行Qt开发&#xff0c;还需要重新构建带有Qt功能的镜像 本篇就来介绍如何构建带有Qt功能的系统镜像&#xff0c;并在开发板中烧录构建的镜像。 1 Distribution包的构建 ST…

优化模型:MATLAB整数规划

一、整数规划介绍 1.1 整数规划的定义 若规划模型的所有决策变量只能取整数时&#xff0c;称为整数规划。若在线性规划模型中&#xff0c;变量限制为整数&#xff0c;则称为整数线性规划。 1.2 整数规划的分类 整数规划模型大致可分为两类&#xff1a; &#xff08;1&…

HAL库的常用库函数(根据学习而更新)

目录 一、常用的GPIO相关HAL库函数 1、GPIO的初始化 2、配置GPIO引脚输出电平 3、切换指定引脚的电平&#xff0c;电平的翻转 4、读取指定GPIO引脚的电平 5、结构体 GPIO_InitTypeDef &#xff08;引脚&#xff09;定义&#xff1a; 6、高低电平的表示 7、延时函数&…

Java架构师系统架构需求分析实战

目录 1 导语2 需求分析实战3 核心方法论-架构立方体4 功能性模型-模块定义5 功能性模型-模块关系图6 功能性模型-模块细化 想学习架构师构建流程请跳转&#xff1a;Java架构师系统架构设计 1 导语 架构设计的实战和思维方法的讨论&#xff0c;主要聚焦于需求分析的重要性和方…

buuctf-Misc 题目解答分解97-99

97.[BSidesSF2019]zippy 下载完就是一个流量包 追踪tcp nc -l -p 4445 > flag.zip unzip -P supercomplexpassword flag.zip Archive: flag.zip 压缩包密码 supercomplexpassword 保存为 flag.zip 解压得到flag 98.[GUET-CTF2019]虚假的压缩包 先从虚假的压缩包入手 &am…

逆向P1P2总结

字节八位 word 16位 deword 32 位 00 00 00 e8 是存储32位信息的起点 不是程序运行的起点 为什么电脑有32位与64位之分 寻址宽度 以字节为单位 0xfffffff 1 就是最大容量 转为十进制为 4294967296 / 1024 &#xff08;k&#xff09;/1024 &#xff08;kb&#xff09;/ 1…

软件测试面试八股文——基础篇

5&#xff09;错误推测法&#xff1a;是基于经验和直觉推测程序中所有可能存在的各种错误&#xff0c;从而有针对性的设计测试用例的方法 6&#xff09;正交实验法 7&#xff09;判定表法 8&#xff09;测试大纲法 3、提交缺陷的八大要素 1&#xff09;缺陷编号&#xff1a…

数据通信网络基础华为ICT网络赛道

目录 前言&#xff1a; 1.网络与通信 2.网络类型与网络拓扑 3.网络工程与网络工程师 前言&#xff1a; 数据通信网络基础是通信领域的基本概念&#xff0c;涉及数据传输、路由交换、网络安全等方面的知识。华为ICT网络赛道则是华为公司提出的一种技术路径&#xff0c;旨在通…

合并的单元格如何填充连续的序号

希望你以后碰到合并的单元格&#xff0c;不在一个个输入序号&#xff0c;用以下操作帮你输入连续的序号。 一、操作过程如下 1.有一个基准的单元格在同一列&#xff0c;而且这个基准单元格必须得是序号为1的单元格的上面的一个单元格&#xff0c;这样的话后面才能自动递增&am…

Cesium.js三维地图的实现(依托天地图CDN文件)

零、技术选型&#xff1a; Vue2、VueCli5、天地图、Cesium.js 一、通过天地图官网案例实现 需要引入天地图官方提供的CDN链接访问Cesium.js相关文件 相关文件&#xff1a; https://api.tianditu.gov.cn/cdn/demo/sanwei/static/cesium/Cesium.js https://api.tianditu.gov.cn/…

大数据技术学习笔记(十一)—— Flume

目录 1 Flume 概述1.1 Flume 定义1.2 Flume 基础架构 2 Flume 安装3 Flume 入门案例3.1 监控端口数据3.2 实时监控单个追加文件3.3 实时监控目录下多个新文件3.4 实时监控目录下的多个追加文件 4 Flume 进阶4.1 Flume 事务4.2 Flume Agent 内部原理4.3 Flume 拓扑结构4.3.1 简单…

PyQt5和Qt designer的详细安装教程

Qt designer界面和所有组件功能的详细介绍参考&#xff1a;https://blog.csdn.net/qq_43811536/article/details/135186862?spm1001.2014.3001.5501 目录 0. 写在前面1. Anaconda创建虚拟环境2. 安装PyQt5和Qt designer3. 测试安装成功 0. 写在前面 Qt Designer是Qt提供的一种…

智慧互联网银行引领金融变革,开源网安VulHunter护航数字化发展

某银行作为国内知名的互联网银行&#xff0c;以构建“智慧型互联行”为总体战略目标&#xff0c;始终坚持科技赋能金融的理念。通过AI、大数据、云计算等数字技术与金融业务的探索融合&#xff0c;实现以更低的成本为客户提供便捷、高效和优质体验的互联网金融服务。 架构升级助…

操作无法完成(错误 0x000006ba),Windows 11 PDF打印机无法使用解决办法

操作无法完成(错误 0x000006ba)&#xff0c;Windows 11 PDF打印机无法使用解决办法 解决方式一 先重启一次电脑&#xff0c;看看是否可以解决问题。 解决方式二 重新启动 Printer Spooler 服务

【JAVA】黑马MybatisPlus 学习笔记【三】【拓展功能】

3.扩展功能 3.1.代码生成 在使用MybatisPlus以后&#xff0c;基础的Mapper、Service、PO代码相对固定&#xff0c;重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO、Mapper、Service等相关代码。只不过代码生成器同样要编码使用&#xff0c;…

【QT】可执行文件图标由png格式手动改为ico格式,Qt程序报错原因及解决方案

1问题说明&#xff1a; 在修改可执行文件图标时&#xff0c;由png格式手动改为ico格式&#xff0c;Qt程序会报错。 报错如下&#xff1a; 2解决办法&#xff1a; 登录网页 在线生成透明ICO图标——ICO图标制作&#xff0c;利用ico在线生成透明ICO图标 将生成的ico图标由favicon…

CSRF(Pikachu)

CSRF&#xff08;get&#xff09; 首先我们先登录账号 admin 密码是&#xff1b;123456 点击修改个人信息 用F12或者BP 抓包看看我们的url 那么构成的CSRF攻击payload为http://pikachu.shifa23.com/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sexboy&phonenum”手机…

如何申请云闪付支付接口?

随着移动支付的普及&#xff0c;越来越多的商家开始接受各种移动支付方式。而在众多移动支付工具中&#xff0c;云闪付支付接口因其安全、便捷的特点&#xff0c;成为了越来越多商家的首选。那么&#xff0c;如何申请云闪付支付接口呢&#xff1f;本文将为您详细介绍申请云闪付…
最新文章