评论

简单且实用的购物车实现方案

一个简单、实用且经过多个商用验证的购物车解决方案。

本方案主要特点:

购物车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(){
    //生成待支付订单,同时后台减库存
  },


四、去支付。

最后一次编辑于  2022-04-27  
点赞 2
收藏
评论

1 个评论

  • Zhao ZW
    Zhao ZW
    2022-04-27

    学习了!


    2022-04-27
    赞同
    回复
登录 后发表内容