本方案主要特点:
购物车cart数据保存在storage,不保存在云数据库。
好处及原因:
1、简单;
2、体验流畅。
在用户点击“加入购物车”后,不需要与后台数据库同步数据,完全没有卡顿现象,体验很好;
3、可扩展。
将来如果需要上传用户购物车数据到后台时,可以任何地方加入相关代码,将cart数据同步到数据库去,不需要改变现有的代码流程;
以下是实现流程及代码:
一、当用户点击“+1”或“-1”,在购物车中加货或减货;
1、购物车的增减功能;
2、tab页中小红点;
3、onShow实现多个页面的数据同步,比如在首页+1了,在分类页、购物车页会同步显示+1;
onUpdateCart: function (e) {
let product = e.currentTarget.dataset.item//读取传入的产品数据
let action = e.currentTarget.dataset.action//取值为'reduce'和'increase'
let cart = lib.updateCart(product, this.data.cart, action)//计算新的cart表
this.setData({ cart })//刷新wxml上的cart渲染
wx.setStorageSync('cart', cart)//将新cart保存到缓存
lib.badgeCart(cart)//更新tab页中cart页的小红点:显示/消除小红点,或显示购物车的商品数值
},
onShow: function () {
let cart = wx.getStorageSync('cart') || []//读取缓存中的cart表。
lib.badgeCart(cart)//更新tab页中cart页的小红点:显示/消除小红点,或显示购物车的商品数值
this.setData({ cart })
},
二、用户点击“去结算”时;
1、购物车数据与后台数据实时同步。
onSettle: async function (cart) {
//此处按其他业务逻辑过滤cart
let ids = cart.map(v => v._id)//获取cart中所有产品的_id组
//从库里读取这组产品的最新数据
let res = await db.collection('product').aggregate()
.match({
_id: _.in(ids),
...{
//other query
}
})
.group({
_id: null,
stocks: app.$.push('$$ROOT') //一次性超限拉取所有产品列表
})
.end()
let stocks = res.list[0].stocks//获取库中最新的产品列表
//将cart里产品与后台读取的数据进行对比,裁剪库存以及相关数据。包括缺货,库存不足,价格变动,等最新数据
lib.cartFilter(stocks, cart)
wx.navigateTo({//跳转到结算页,计算订单总额、运费等
url: '../settle/settle',
})
},
三、用户点击“生成订单”
1、实现购物车中删除订单所含的产品,
2、后台数据库减库存
//清除缓存中的cart列表
cleanCart: function (order) {
let dcart = order.items//订单中的商品表
let scart = wx.getStorageSync('cart')//缓存中的商品表
dcart.forEach(v => {
let index = scart.findIndex(u => v._id == u._id)
if (index > -1) {
scart.splice(index, 1)
}
})
wx.setStorageSync('cart', scart)
},
onCreateOrder:function(){
//生成待支付订单,同时后台减库存
},
四、去支付。
学习了!