7.添加购物车以及完善导航条跳转

添加购物车

  • 一、引言
  • 二、前端
    • 2.1引入轻组件
    • 2.2为图片添加点击事件
    • 2.3创建addShoppingCart函数
  • 三、后端
  • 四、运行效果
  • 五、导航条跳转

一、引言

在前几篇文章中,我们一步一步慢慢的实现了项目的建立,从数据库获取数据显示在页面,商品大图查看,查询和商品分页功能,以及登录退出,涉及一些模态框和轻组件的使用。到这里应该对于前后端的数据的交互比较了解了,从后端到前端再到我们所看见的网页,就是这样一步一步建立起来的。
你眼中所看到的效果功能是怎么实现的,
在学习的过程中,会逐渐发现很多代码其实都是做重复的动作,只是对于细节的处理逻辑略有不同。
我们学习这个项目,并不是单单学习怎么去做这么个商城项目,我们更多的是学他们的代码的逻辑,前后端怎么一起实现的功能,去理解代码为什么这么写,去学习他们代码的架构,层次。一句话,学习怎么学习!

二、前端

现在我们来实现添加购物车:把商品添加到购物车中去。
目的:用户点击商品卡片那个购物小车,完成该商品的购物车添加,针对成功与否提示相关信息。

2.1引入轻组件

在首页index.html,根据自己网页来,引入轻组件用来提示操作信息,前面也引入过,不多叙述了。
两步:

  1. 引入组件代码。
<div class="toast-container position-fixed top-0 start-50 translate-middle-x mt
1">
    <div id="toast" class="toast opacity-100 bg-white">
        <div class="toast-header">
            <strong class="me-auto"></strong>
            <button type="button" class="btn-close" data-bs-dismiss="toast">
            </button>
        </div>
        <div class="toast-body"></div>
    </div>
</div>
  1. 组件转换对象,创建函数来自定义显示提示。
    //创建轻组件对象
    const toastObj = new bootstrap.Toast(document.querySelector(`#toast`), {delay: 2200});

    const toast = (title = "信息", msg = "") => {
        document.querySelector('#toast .me-auto').innerHTML = title;
        document.querySelector('#toast .toast-body').innerHTML = msg;
        toastObj.show();
    }

2.2为图片添加点击事件

<img onclick="addShoppingCart(${list[i].meal_id})" 
src="./images/shopping-cart.png" style="height:35px;cursor: pointer;" 
class="pe-1">

这里是为小车图片添加onclick属性,实现点击调用添加购物车函数。
其中参数是商品的id,从list对象中获取,list是我们在getMealList函数中建立的:
const list = pageObj.recList;
而其中recList中数据是这样的:
在这里插入图片描述
在这里给大家回忆一下,避免产生疑惑哪来的list[i]。

2.3创建addShoppingCart函数

接下来,在上面调用了addShoppingCart函数,所以现在来实现这个函数。

 const addShoppingCart = async(meal_id) => {
        const resp = await fetch(`./meal/add-cart?meal_id=${meal_id}`);
        if (!resp.ok) return;
        const result = await resp.json();
        if (!result.success) {
            toast("错误", result.message);
            console.log("错误", result.message);
            return;
        }
        toast("成功", "加购物车成功");
    };
  1. 将meal_id通过fetch函数,指定路径包含参数像后端发起请求,返回响应。
  2. 判断响应状态,解析json数据,判断数据对象,根据result.success做出不同的提示,调用组件函数显示不同的提示。

前面类似的写过,所以这里简单叙述。
前端就完成了。
现在来实现后端的逻辑。

三、后端

  1. 老规矩,一个新的功能方法,我们先添加新的路径在WebServlet注解中:
  "/meal/add-cart"
  1. 在判断路径的switch分支结构中也加上新的case板块:
            case "/meal/add-cart":
                mealAddCart(req, resp);
                break;
  1. 最后实现mealAddCart函数:
 private void mealAddCart(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        User user = (User) req.getSession().getAttribute("CurrUser");
        if (user == null) {
            MyWeb.printJson(resp, R.err("请先登录!"));
            return;
        }
        String meal_id = req.getParameter("meal_id");
        String selSql = "select sm_store from t_meal where meal_id = ?";
        Dao dao = DaoCreater.currentDao();
        int meal_num = dao.queryInteger(selSql, meal_id);
        if (meal_num < 1) {
            MyWeb.printJson(resp, R.err("库存不足!"));
            return;
        }
        String updSql = "update t_shoppingcart set s_num = s_num + 1 where u_id = ? and meal_id = ?";
        int count = dao.update(updSql, user.getU_id(), meal_id);
        if (count == 0) {
            String insSql = "insert into t_shoppingcart (u_id,meal_id,s_num) values(?,?,1)";
            dao.update(insSql,user.getU_id(),meal_id);
        }
        MyWeb.printJson(resp,R.OK());
    }
  1. 加购物车之前我们得判断有没有用户信息,也就是有没有登录,没有就要在返回的响应中告诉前端,让前端来处理。
    如果登录了,就开始获取请求中包含的数据。其中getParameter 方法返回与指定参数名称相关联的值。如果请求中不存在该参数,它将返回 null。通常用于从表单提交或URL中读取用户输入的数据,然后根据这些数据进行进一步的处理。我们在URL中参数名是meal_id,所以我们指定获取参数meal_id。
  2. 定义sql语句用来查询数据库中的库存量,sm_store是我们在数据库存储库存量的变量名,在这里? 是一个占位符,用于后续的参数绑定以防止SQL注入攻击,queryInteger(selSql, meal_id);会执行sql语句进行数据库查询,meal_id会取代?的位置组成完整的sql语句。
  3. 接下来判断获取的库存量,没有了就返回响应告诉前端,我没货了,让前端在告诉用户。如果有库存就进行继续。
  4. 既然库存有,那么我们就要像购物车中更新数据,没数据就添加数据。
    查询t_shoppingcart表中指定u_id和meal_id的s_num,就是说查找这个用户有没有这款商品,有就让数量加一,没有就就什么也不做,在这里count是所影响的行数。
  5. 后续判断等于0,那么说明u_id和meal_id相关联的数据没有,也就是此前这个用户没添加过该商品到购物车。所以向表中u_id和meal_id相关联的s-num数据设置为一,执行sql操作。
    最后完成后返回包含成功的响应给前端处理。
    到这里就完成了。
    可以启动项目查找bug了[坏笑],如果运行不成功的话。

其实这里有个疑问,购物车数据增加了,库存的数据是不是应该减少相应的,后续再说吧。

四、运行效果

  1. 没登录之前添加购物车:
    在这里插入图片描述
  2. 登陆后添加购物车:
    在这里插入图片描述
    还有库存不足,应该也没有问题。那么就基本实现了。

五、导航条跳转

在首页我们还有一些导航条没实现跳转,以及其他页面跳转需要完成,同时getCurrUser函数也需要复制到其他页面以显示当前用户,我们先完成这些繁琐的工作。
看过前面的应该自己就会加了,这里直接上部分代码为例:

        <ul class="nav nav-pills ms-5">
            <li class="nav-item">
                <a class="nav-link bg-white text-danger fw-bolder" href="index.html">首页</a>
            </li>
            <li class="nav-item">
                <a class="nav-link text-white" href="cart.html">购物车</a>
            </li>
            <li class="nav-item">
                <a class="nav-link text-white" href="order.html">订单</a>
            </li>
        </ul>

在href属性添加其他相应网页html文件就行了。
提一句:这里这些都是<a标签的,所以自带超链接,不需要像按钮那样加onclick属性。

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

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

相关文章

C++ JAVA源码 HMAC计算 openssl 消息认证码计算 https消息防篡改 通信安全

签名和验签 把所有消息按顺序合并成一条信息&#xff0c;对这个信息用密钥进行签名。 签名信息通过 HTTP 头 Sign 传递&#xff0c;没有携带签名或者签名验证不通过的请求&#xff0c;将会被认为异常请求&#xff0c;并返回相应 code 码。 校验方法&#xff1a;根据 http请求…

国产3A游戏《黑神话悟空》中AI绘画技术的运用与探索

导语&#xff1a;近年来&#xff0c;我国游戏产业不断发展&#xff0c;越来越多的国产游戏开始尝试运用AI技术&#xff0c;以提升游戏品质。其中&#xff0c;国产3A游戏《黑神话悟空》便在原画设计过程中&#xff0c;巧妙地运用了AI绘画技术。本文将带你了解《黑神话悟空》如何…

【计算机三级-数据库技术】操作题大题(第六套)

第六套操作题 第46题 假定要建立一个学校科研项目管理的信息系统&#xff0c;需要管理如下信息&#xff1a; 教师&#xff1a;教师编号、教师姓名&#xff1b; 项目&#xff1a;项目编号、项目名称、资助额&#xff1a; 学生&#xff1a;学生编号、学生姓名、学位&#xff0c…

Vodafone 推出了与 Wi-Fi 竞争的基于树莓派私人5G技术

随着全球5G网络的逐步推出&#xff0c;在其过程中遇到了可预见的起起伏伏&#xff0c;并且蜂窝技术也开始进入另一个无线技术 Wi-Fi &#xff0c;并且已经占据的市场。私有5G网络&#xff08;即个人或公司建立自己的全设施蜂窝网络&#xff09;如今正在寻找曾经属于Wi-Fi的唯一…

AR 眼镜之-系统应用音效-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 系统应用音效 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;初始化 2&#xff09;播放音效 3&#xff09;释放资源 2. &#x1f4a0; 播放音效 2.1 静音不播放 2.2 获取音效默认音量 3. ⚛️ …

QTCreator学习

1.新建程序 2. 设置项目名称 3. Build System选择qmake,若选择cmake则只会产生CmakeLists文件&#xff0c;不会产生pro文件。 4.Base class选择QDialog,表示该类继承于QDialog类 5.套件选择MinGW 32bit,取消掉其他的。 6. 双击ui文件&#xff0c;拖动可添加工具。 7.点击左…

C++模拟实现priority_queue(优先级队列)

一、priority_queue的函数接口 从上图我们可以看出&#xff0c; priority_queue也是一个容器适配器&#xff0c;我们使用vector容器来模拟实现priority_queue。 namespace bit{#include<vector>#include<functional>template <class T, class Container vector…

iOS App上架审核被拒——2.3.3 - Performance - Accurate Metadata

iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata 噢&#xff0c;又被拒了… 文章目录 iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata被拒原因解决 被拒原因 大概翻译了下&#xff1a;预览图问题&#xff0c;只因某张预览图加了…

正则表达式备查

一、常用 符号内容\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c;“n”匹配字符“n”。“\n”匹配换行符。序列“\”匹配“\”&#xff0c;“(”匹配“(”。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还…

CSS知识点详解:display+float

display&#xff1a;浮动 1.block&#xff1a;使元素呈现为块级元素&#xff0c;可设置宽高 display: block; 特点&#xff1a;使元素呈现为块级元素&#xff0c;即该元素会以新行开始&#xff0c;占据整行的宽度&#xff0c;即使其宽度未满。 例子&#xff1a; 2.inline&a…

答题小程序的轮播图管理与接入获取展示实现

实现了答题小程序的轮播图管理&#xff0c;包括上传图片、设置轮播图、操作上下线等功能&#xff0c;可用于管理各类答题小程序的轮播图。 轮播图前端接入代码 答题小程序内使用以下代码接入轮播图&#xff1a; WXML&#xff1a; <view style"width: 100%"> …

继承(下)【C++】

文章目录 子类继承父类之后&#xff0c;子类的默认成员函数的变化构造函数编译器自动生成的构造函数程序员手动写的构造函数 拷贝构造编译器自动生成的拷贝构造函数程序员手动写的拷贝构造函数 赋值重载编译器自动生成的赋值重载程序员手动写的赋值重载 析构函数 继承与友元菱形…

ISO 26262中的失效率计算:IEC 61709-Clause 17_Switches and push-buttons

概要 IEC 61709是国际电工委员会&#xff08;IEC&#xff09;制定的一个标准&#xff0c;即“电子元器件 可靠性 失效率的基准条件和失效率转换的应力模型”。主要涉及电学元器件的可靠性&#xff0c;包括失效率的基准条件和失效率转换的应力模型。本文介绍IEC 61709第十七章&…

Linux安装并配置Hadoop

目录 一、安装并配置JDK二、安装并配置Hadoop三、安装过程中遇到的问题总结 一、安装并配置JDK Linux上一般会安装Open JDK,关于OpenJDK和JDK的区别&#xff1a;http://www.cnblogs.com/sxdcgaq8080/p/7487369.html 准备Open JDK 1.8 查询可安装的java版本 yum -y list jav…

C语言第17篇

1.在C语言中,全局变量的存储类别是_________. A) static B) extern C) void D) register 提示&#xff1a;extern adj.外来的 register n.登记表&#xff0c;v.登记 提示与本题无关 2.在一个C源程序文件中,要定义一个只允许本源文件中所有函数使用的全局变…

【经典算法】BFS_最短路问题

目录 1. 最短路问题介绍2. 算法原理和代码实现(含题目链接)1926.迷宫中离入口最近的出口433.最小基因变化127.单词接龙675.为高尔夫比赛砍树 3. 算法总结 1. 最短路问题介绍 最短路径问题是图论中的一类十分重要的问题。本篇文章只介绍边权为1(或边权相同)的最简单的最短路径问…

ant design pro 中用户的表单如何控制多个角色

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的 看上面的图片 当创建或编辑一个用户时&#xff0c;…

自带灭火电池?深蓝SL03托底事故揭秘

近日&#xff0c;网络上的一段热传视频&#xff0c;让不少网友看得先是惊心动魄&#xff0c;然后却又啧啧称奇。 该视频显示&#xff0c;8月18日晚上19点28分&#xff0c;一辆深蓝SL03在行驶中意外遭遇严重托底事故&#xff0c;车辆瞬间腾空跳跃&#xff0c;紧接着底盘出现明火…

禁止浏览器默认填充密码 vue

禁止浏览器默认填充密码会和我的样式冲突 所以禁止 第一种&#xff1a; 通过给表单元素添加 autocomplete"off" 属性&#xff0c; 可以防止浏览器自动填充表单中的账号和密码。可以在 input 标签或整个 form 标签上使用&#xff1a; <template><a-form&g…

向量数据库中的PQ(Procduct Quantization)

为了加快向量之间距离计算和比较速度&#xff0c;有人发明的Product Quantization方法&#xff0c;这个方法并不是一种索引&#xff0c;所以它并不能减少目标向量&#xff08;要查找的向量&#xff09;&#xff0c;与数据库中向量的比较次数&#xff0c;但是它可以加快与每个数…