电商购物网站 - 购物车结算

news/2024/4/27 8:46:55/文章来源:https://blog.csdn.net/weixin_33735077/article/details/89039851

1、添加视图和集合

添加商品链接

上节课程里我们已经实现了商品的添加和展示,接下来我们开始进行对商品的操作——加入购物车。

首先,商品页的加入购物车按钮、购物车查看按钮添加链接,如下所示:

<a href="/addToCart/<%=Commoditys[i]._id%>">加入购物车</a>

我们先定义购物车(cart)集合的Schema属性,包含:uId(用户ID)、cId(商品ID)、cName(商品名称)、cPrice(商品价格)、cImgSrc(商品展示图片路径)、cQuantity(商品数量)、cStatus(商品结算状态,默认为false),参考如下:

cart: {uId: {type: String},cId: {type: String},cName: {type: String},cPrice: {type: String},cImgSrc: {type: String},cQuantity: {type: Number},cStatus: {type: Boolean, default: false}
}

以上属性定义我们还是统一放到models.js文件中以方便管理和操作。

接着views目录下添加购物车(cart.html)视图页面,参考如下:

购物车页面的展示实现可参考如下贴图:

<ul><%for(var i in carts){if(!carts[i].cId){continue;}}%><li><div class="li-checkbox"><input data-id="<%=carts[i]._id%>" data-index="<%=i%>" data-price="<%=carts[i].cPrice%" name="chkItem"class="li-checkbox input" type="checkbox"></div><div class="li-img"><a><img src="img/<%=carts[i].cImgSrc%>" class="li-img a img"></a></div><div class="li-content"><a><%=carts[i].cName%></a></div><div class="li-price"><span><%=carts[i].cPrice%></span></div><div class="li-quantity"><a data-type="add" href="javascript:void(0);" class="btn btn-default btn-xs">+</a><input id="Q<%=i%>" style="width: 40px;" type="text" value="<%=carts[i].cQuantity%>"><a data-type="subtr" href="javascript:void(0);" class="btn btn-default btn-xs">-</a></div><div class="li-del"><a href="/delFromCart/<%=carts[i]._id%>" class="btn btn-primary btn-xs">删除</a></div></li><%}%>
</ul>

2、定义视图路由

访问视图

接着在routes目录添加cart.js文件(index.js文件中引用),来定义路由处理规则。

比如cart路径的处理,如下:

1.检测登陆用户是否过期,已过期则跳转login页同时给出提示信息。

2.通过global.dbHelper.getModel方法获取cart模型。

3.通过find查询用户所有商品并传入模板,条件:用户ID,结算状态。

4.贴出部分代码:

app.get('/cart', function (req, res) {......Cart.find({"uId": 用户ID, "cStatus": false}, function (error, docs) {res.render('cart', {carts: docs});});
});

加入购物车按钮链接所对应路径的处理,如:/addToCart/:商品id

app.get("/addToCart/:id", function(req, res) {...});

1.通过req.params.id获取商品ID号并检测登陆用户状态。

2.通过global.dbHelper.getModel方法获取购物车(cart)、商品(commodity)模型。

3.商品已存在则进行更新操作,贴出部分参考代码:

Cart.update({"uId":用户ID,"cId":商品ID},{$set:{cQuantity:已有数量+1}}

4.商品未存在则进行添加操作,贴出部分代码:

Commodity.findOne({"_id": 商品ID}, function (error, doc) {Cart.create({uId: 用户ID,cId: 商品ID,cName: doc.name,cPrice: doc.price,cImgSrc: doc.imgSrc,cQuantity : 1},function(error,doc){if(doc){res.redirect('/home');}});
});

3、商品的单选和全选

在购物车页面展示还是使用ejs模板(具体实现可参考贴图)来实现用户购物车商品的展示,现期间我们用到了checkbox,这里我们就来简单的实现商品的全选和单选。

首先,简单介绍实现步骤:

  1. 用户选中全选按钮时,列表内选框全部变为勾选状态。

  2. 用户取消全选按钮选中状态时,列表内选框全部取消勾选状态。

  3. 列表内选框为全部勾选状态时,全选按钮为选中状态,反之不勾选。

  4. 全选按钮未选中情况下,当列表内按钮全部选中则全选按钮也要被选中。

对于checkbox按钮如下图所示:

<div class="li-checkbox"><input data-id="<%=carts[i]._id%>" data-index="<%=i%>" data-price="<%=carts[i].cPrice%" name="chkItem"class="li-checkbox input" type="checkbox">
</div>  

注:data-index属性存储索引值用来获取商品数量,data=id存储商品IDdata-price存储商品价格。

实现全选:为全选框(如idCheckAll)添加单击事件,这里我们使用prop方法设置checkbox状态、is方法判断checkbox状态,如下参考示例:

$('#CheckAll').click(function(){var self = $(this);$('input[name="chkItem"]').each(function(){$(this).prop("checked",self.is(':checked'));});});

实现单选:单选框(如namechkItem)添加单击事件,这里我们使用prop方法设置checkbox状态、not方法判断checkbox状态,如下参考示例:

$('input[name="chkItem"]:checkbox').click(function(){var isCheck = $('input[name="chkItem"]:not(:checked)').length?false:true;$('#CheckAll').prop("checked",isCheck);
});

到这里我们就简单实现了按钮的全选和单选,以上方法可供参考也可以自行思路去实现。

4、商品的数量加减

前面我们实现了对于商品的单选和全选功能,下面我们就开始实现商品数量的加减。

对于+-按钮如下所示:

<div class="li-quantity"><a data-type="add" href="javascript:void(0);" class="btn btn-default btn-xs">+</a><input id="Q<%=i%>" style="width: 40px;" type="text" value="<%=carts[i].cQuantity%>"><a data-type="subtr" href="javascript:void(0);" class="btn btn-default btn-xs">-</a>
</div>

简单实现步骤如下:

  1. 定义data-type属性用于区分+-按钮。

  2. a标签添加单击事件。并同时改变显示框的值。

  3. 使用siblings()方法改变同级标签的数量值。

具体实现可参考如下方法:

$('.li-quantity a').click(function(){var self = $(this);var type = self.attr('data-type'),num = parseFloat(self.siblings('input').val());if(type == 'add'){num += 1;}else if(type == 'subtr'){if(num > 1){num -= 1;}else{return false;}}self.siblings('input').val(num);
});

到这里对于商品数量的加、减也实现了,接着我们开始实现用户选中商品的总价格计算功能。

5、商品总金额的计算

计算总金额

商品的状态选择和数量的加减功能我们已经实现了,选择我们就开始实现当用户选择相关商品时总金额的计算功能。

实现步骤如下:

  1. 定义公共方法,用于用户不同加、减、全选等操作时皆可调用。

  2. 循环列表内所有被选中的checkbox(假设namechkItem)。

  3. 使用checkbox的相应属性值,来获取价格和数量。

  4. 定义全局变量(假设为sum)存储总金额并赋值显示。

具体方法实现可参考如下内容:

sum = 0;
$('input[name="chkItem"]:checked').each(function () {var self = $(this),price = self.attr('data-price'),index = self.attr('data-index');var quantity = $('#Q' + index).val();sum += (parseFloat(price) * parseFloat(quantity));
});
$("金额标签").html('¥' + sum + '.00');

到这里,选中商品的价格总计功能也就简单实现了。

6、结算功能的实现

商品结算

关于结算功能,这里就做简单介绍,当用户点击结算按钮时,计算出被选商品的总金额,给予alert出总金额,数据库则更新相应商品的结算状态和数量,当然你也可以在购物车集合中添加一个用户消费金额的属性来保存所消费的金额总数更好,这里就简单处理了。

具体功能实现这里简单介绍如下:

  1. 定义公共方法,用于用户不同加、减、全选等操作时皆可调用。

  2. 循环列表内所有被选中的checkbox(假设namechkItem)。

  3. 使用checkbox的相应属性值,来获取价格和数量。

  4. 定义全局变量(假设为sum)存储总金额并赋值显示。

这里贴出部分实现代码,如下:

//结算方法内容
$('input[name="chkItem"]:checked').each(function(){var self = $(this),//通过data-index属性,获取索引值index = self.attr('data-index'),//通过data-id属性,获取对应IDID= self.attr('data-id');var 数量= $('#Q'+index).val();var data = { "cid": ID, "cnum":数量};//发送数据请求...   
});
alert('所付金额为:¥'+sum);
location.href = "cart";

cart.js文件添加对应路由处理如下:

app.post("路径",function(req,res){var Cart = global.dbHelper.getModel('cart');Cart.update({"_id":req.body.ID},{$set : { cQuantity : req.body.数量,cStatus:true }},function(error,doc){ 
...

7、购物车商品的删除

商品删除

关于商品的删除功能就简单多了,我们只需获取其ID即可实现对于购物车内商品的删除操作

在购物车商品的展示功能实现时,我们就可以获取其ID,如下参考:

<a href="/delFromCart/<%=carts[i]._id%>" >删除</a>

cart.js文件,添加对应路径处理方法,这里简单实现参考如下:

app.get("/delFromCart/:id", function(req, res) {//req.params.id 获取ID号var Cart = global.dbHelper.getModel('cart');Cart.remove({"_id":req.params.id},function(error,doc){//成功返回1  失败返回0if(doc > 0){res.redirect('/cart');}});
});

好,到这里所有功能都已经实现了。

附上本电商网站项目的源码,供各位研究、开发、扩展

欢迎提issues

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

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

相关文章

关于PV,网站访问量和服务器带宽的选择

网站用户访问流量图对于PV&#xff0c;流量和带宽的理解&#xff0c;可以分成几个问题可能更加容易理解问题1&#xff1a;首先什么是PV技术角度讲,1个PV是指从浏览器发出一个对网络服务器的Request网络服务器接到Request之后会开始把该Request对应的一个Page&#xff08;Page就…

黑客组织攻击叙利亚政府网站并曝光43GB数据

Risk Based Security(RBS)的分析师们对来自55个不同网站域名的38,768个文件夹和247,477个文件展开了分析。在这55个域名中有25个属于政府网站(.gov.sy)&#xff0c;两个为.org.sy域名&#xff0c;一个为.com.sy域名&#xff0c;其余则都是.sy域名。 RBS在分析文章中指出&#x…

html获取url后面的参数_URL静态化的含义及网站伪静态对网站SEO优化的好处

今天我们来讲解一下什么是URL静态化&#xff0c;URL静态化也被称作网站伪静态&#xff0c;指的是通过技术手段将动态网址改变成静态网址的过程。下面我们来仔细解读一下它的含义及作用。一、互联网中网站URL(网址)种类&#xff1a;1、静态网址。网站的网址一般以htm或者html结尾…

tomcat https访问和使用域名访问网站

2019独角兽企业重金招聘Python工程师标准>>> 版本: centos 6.5 tomcat 9.0 java 1.8 1.首先使用keytool工具生成证书: keytool 命令的目录是:/usr/local/java/bin下 配置了java的环境就可以直接使用. keytool -genkeypair -alias "tomcat" -keyalg "…

seo原创工具_「黑帽SEO」如何从零开始学习黑帽SEO?「第三篇」

1.文章内容采集说到内容采集相信大家都是太熟悉了&#xff0c;基本所有SEOer都“采集”过一些内容&#xff0c;内容采集可以使用CMS程序自带或软件的采集功能&#xff0c;填充大量质量低劣的网站内容和垃圾信息。当然&#xff0c;大量采集网络中的重复内容&#xff0c;最终的结…

配置Exchange OWA和Sharepoint网站单点登录

如果我们在组织中已经部署完成了Lync、Exchange以及Sharepoint&#xff0c;那么我们会发现这三套系统在通过域账户登录计算机时&#xff0c;如果本机有安装Outlook和Lync&#xff0c;那么在登录Lync或启动Outlook的时候就会自动使用当前登录计算机凭据进行登录。但如果这个时候…

企业网站推广的方法有哪些?

网站推广就是以互联网为基础&#xff0c;借助平台和网络媒体的交互性来辅助营销目标实现的一种新型的市场营销方式。当前传播常见的推广方式主要是在各大网站推广服务商中通过买广告之类等等方式来实现&#xff0c;免费网站推广包括&#xff1a;SEO优化网站内容或构架提升网站在…

知乎不能改用户名吗_网站标题可以改吗?网站标题怎么写才容易有排名?

网站的标题是指网页的标题&#xff08;TDK中的T&#xff1a;title&#xff09;&#xff0c;标题可以直接显示在搜索结果中。另外&#xff0c;网站SEO标题在搜索引擎优化中&#xff0c;是极其重要的&#xff0c;它影响了网站排名的速度&#xff0c;也影响了网站排名的位置。所以…

SharePoint Online 创建网站集

前言 本文介绍如何在Office 365中创建SharePoint网站集。 正文 通过登录地址登录到Office 365环境中&#xff0c;我们可以在左上角的按钮中点开&#xff0c;进入管理员&#xff0c;也可以直接在页面中点击管理&#xff1b; 登录地址&#xff1a;https://login.microsoftonline.…

浅谈SPA、SEO、SSR

前后端分离算是最近Web开发的大趋势了&#xff0c;目前已经有大量的公司使用了前后端分离的开发方式。那我们就来大概谈谈前后端分离开发中必须要了解和接触的几个概念&#xff1a;SPA、SEO和SSR。在谈这几个概念之前&#xff0c;先来聊聊我理解的前后端分离。 我理解的前后端…

QQ空间Python爬虫(1)---网站分析

闲来无事准备写一个爬虫来爬取自己QQ空间的所有说说和图片-。- 首先准备工作&#xff0c;进入手机版QQ空间&#xff0c;分析页面&#xff1a; 我们发现&#xff0c;手机版空间翻页模式是采用瀑布流翻页&#xff08;查看更多&#xff09;&#xff0c;而非传统翻页模式&#xff0…

01-19asp.net网站--关于“应用程序中的服务器错误(需添加JqueryScriptRescourseMapping)”...

一般打开网页进行加载时&#xff08;有缓存&#xff09;&#xff0c;会弹出以下对话框。 但是如果网页加载后出现以下错误&#xff0c;就是应用程序的问题了。如果出现这种问题&#xff0c;就需要在安装Csharp的根目录下&#xff0c;找到一个名为.dll结尾的Jquery程序集&#x…

记一个爬虫加密网站算法的解密

为什么80%的码农都做不了架构师&#xff1f;>>> 网站就不发了具体过程呢&#xff1a; 通过阅读晦涩无比的代码发现它使用的是AESgzip压缩实现的加密 首先加密数据是17WSPeYwQFufy74vaYJ4base64的超长字符串 首先用base64解码 我们把加密的base64复制到本地txt 然后…

推荐计算机图形学习网站

计算机图形学是研究用计算机表示、生成、处理和显示图形的学科。它涉及将几何模型和数据转变为图形的各种算法和技术。目前&#xff0c;计算机图形学已经成为计算机科 学与技术中最为活跃的学科分支之一&#xff0c;并在众多领域&#xff08;如&#xff1a;汽车和飞机的设计与制…

Jenkins与网站代码上线

第1章 引入1.1 开发写代码的演变l 一个开发单打独斗&#xff0c;撸代码&#xff0c;开发网站&#xff0c;自由自在&#xff1b;l 多个开发同时开发一个网站&#xff0c;同时改一份代码。但是同时改一个文件会导致冲突。l 采用分支结构&#xff0c;每天上班第一件事克隆代码&…

nginx网站服务(上)

第1章 web网站服务介绍1.1 常用来提供静态Web服务的软件u Apache&#xff1a;这是中小型Web服务的主流&#xff0c;Web服务器中的老大哥。u Nginx&#xff1a;大型网站Web服务的主流&#xff0c;曾经Web服务器中的初生牛犊&#xff0c;现已长大。Nginx的分支Tengine&#xff08…

程序员一般喜欢浏览哪些网站呢?

2019独角兽企业重金招聘Python工程师标准>>> 作为一名非标准程序员我先来说说我的&#xff1a; 技术类 ①云栖社区 ②掘金 ③芋道源码 ④如梦技术 ⑤纯洁的微笑 ⑥码云github ⑦CSDN博客园 运营类 ①虎嗅网 ②36氪 ③雷锋网 科普类 ①果壳网 贴吧看的甚少&#xff0…

一些开源的论坛网站

2019独角兽企业重金招聘Python工程师标准>>> symphony,这个我觉得还挺好的&#xff0c;就是采用了一些自己封装的技术&#xff0c;不如spring 来的开放。 D / symphonyhttps://sym.b3log.org/ hsweb 企业后台管理基础框架 我对其中的一个框架还挺感兴趣的hs-web/hsw…