摘要:通过查询用户所有商品并传入模板,条件用户,结算状态。贴出部分代码用户加入购物车按钮链接所对应路径的处理,如商品通过获取商品号并检测登陆用户状态。通过方法获取购物车商品模型。附上本电商网站项目的源码,供各位研究开发扩展欢迎提
1、添加视图和集合
添加商品链接
上节课程里我们已经实现了商品的添加和展示,接下来我们开始进行对商品的操作——加入购物车。
首先,商品页的加入购物车按钮、购物车查看按钮添加链接,如下所示:
加入购物车
我们先定义购物车(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)视图页面,参考如下:
购物车页面的展示实现可参考如下贴图:
访问视图
接着在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,这里我们就来简单的实现商品的全选和单选。
首先,简单介绍实现步骤:
用户选中全选按钮时,列表内选框全部变为勾选状态。
用户取消全选按钮选中状态时,列表内选框全部取消勾选状态。
列表内选框为全部勾选状态时,全选按钮为选中状态,反之不勾选。
全选按钮未选中情况下,当列表内按钮全部选中则全选按钮也要被选中。
对于checkbox按钮如下图所示:
注:data-index属性存储索引值用来获取商品数量,data=id存储商品ID,data-price存储商品价格。
实现全选:为全选框(如id为CheckAll)添加单击事件,这里我们使用prop方法设置checkbox状态、is方法判断checkbox状态,如下参考示例:
$("#CheckAll").click(function(){ var self = $(this); $("input[name="chkItem"]").each(function(){ $(this).prop("checked",self.is(":checked")); }); });
实现单选:单选框(如name为chkItem)添加单击事件,这里我们使用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、商品的数量加减前面我们实现了对于商品的单选和全选功能,下面我们就开始实现商品数量的加减。
对于+、-按钮如下所示:
简单实现步骤如下:
定义data-type属性用于区分+、-按钮。
a标签添加单击事件。并同时改变显示框的值。
使用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、商品总金额的计算计算总金额
商品的状态选择和数量的加减功能我们已经实现了,选择我们就开始实现当用户选择相关商品时总金额的计算功能。
实现步骤如下:
定义公共方法,用于用户不同加、减、全选等操作时皆可调用。
循环列表内所有被选中的checkbox(假设name为chkItem)。
使用checkbox的相应属性值,来获取价格和数量。
定义全局变量(假设为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出总金额,数据库则更新相应商品的结算状态和数量,当然你也可以在购物车集合中添加一个用户消费金额的属性来保存所消费的金额总数更好,这里就简单处理了。
具体功能实现这里简单介绍如下:
定义公共方法,用于用户不同加、减、全选等操作时皆可调用。
循环列表内所有被选中的checkbox(假设name为chkItem)。
使用checkbox的相应属性值,来获取价格和数量。
定义全局变量(假设为sum)存储总金额并赋值显示。
这里贴出部分实现代码,如下:
//结算方法内容 $("input[name="chkItem"]:checked").each(function(){ var self = $(this), //通过data-index属性,获取索引值 index = self.attr("data-index"), //通过data-id属性,获取对应ID ID= 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,如下参考:
删除
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 失败返回0 if(doc > 0){ res.redirect("/cart"); } }); });
好,到这里所有功能都已经实现了。
附上本电商网站项目的源码,供各位研究、开发、扩展
欢迎提issues
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/19039.html
摘要:本文由网易跨境电商部产品经理曹宏授权发表。根据交易链路的环节,分工可以进一步简单细化为商详页产品导购页产品,购物车产品,订单产品,支付产品。那么购物车的产品都在做什么为了避免假大空,就以购物车改版这个项目介绍一下电商购物车产品的工作。 本文由网易跨境电商部产品经理曹宏授权发表。 作为电商交易链路的产品,很多人会问,你们都在做什么? 关于电商产品的工作分类,从流量角度我简单分为以下几类(...
摘要:登录之后,用户可以对相关商品进行选购并添加到购物车。结构划分项目主要分为以下几大模块注册模块,登录模块,商品模块购物车模块结算模块。购物车模块对相关商品进行增加减少删除操作。结算模块对购物车内已选择商品进行结算。 1、功能介绍 用户可以完成注册、登录,登录后对商品进行浏览。 登录之后,用户可以对相关商品进行选购并添加到购物车。 用户可以对购物车里面的商品进行增加、减少、删除操作。 用...
摘要:同时它也是一个对象数据库,没有表行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储,数据格式就是。我们一共要创建三个集合,分别是用户集合商品集合购物车集合。 1、数据库介绍 MongoDB的简单介绍如下: MongoDB是一个开源的NoSQL数据库,相比MySQL那样的关系型数据库,它更显得轻巧、灵活, 非常适合在数据规模很大、事务性不强的场合下使用。同时它也是一个对象数据库...
摘要:用户注册模块的设计与实现注册模块功能设计介绍功能本模块主要用于新用户注册,用户通过表单提供用户名和密码信息,系统根据用户提供的注册信息对用户进行具体操作。如果身份合法,则用户可进入商品页面。 1、用户注册模块的设计与实现 注册模块功能设计介绍 功能:本模块主要用于新用户注册,用户通过表单提供用户名和密码信息,系统根据用户提供的注册信息对用户进行具体操作。 输入操作:用户名、密码、确认密...
摘要:订单号用户商品标题商品价格商品封面图商品其他属性小明爱疯手机其他属性像上表中设计,有人会问了那关联的意义何在呢我的回答是保持数据关联,虽然商户有可能改变商品属性,但作为一名程序员,应该尽可能的记录用户所有的动作。 showImg(https://segmentfault.com/img/bVbdtuc?w=1824&h=1028); 电商大伙每天都在用,类似某猫,某狗等。电商系统设计看...
阅读 3847·2021-09-27 13:36
阅读 4371·2021-09-22 15:12
阅读 3044·2021-09-13 10:29
阅读 1802·2021-09-10 10:50
阅读 2331·2021-09-03 10:43
阅读 486·2019-08-29 17:10
阅读 426·2019-08-26 13:52
阅读 3201·2019-08-23 14:37