购物车一个电商平台的核心功能之一。从产品层面对购物车的分析有过很好的一篇文章,http://blog.csdn.net/youshandeyang/article/details/5316568。
这个功能看起来很简单,无非就一个页面展示了购物车里的内容;作为电商平台的核心功能之一,购物车功能远非想象中的那么简单。先从产品方面来谈谈。
1,一般会在商品详情页里提供一个加购物车的按钮,这是购物车里内容的来源。但是现在很多应用里商品详情里不再提供直接购买按钮,而是直接都先扔到购物车里。这像极了我们在超市里的购物体验,不管你买多少商品,必须先放购物车了,然后到出口处结账。那么问题就来了,如何进入购物车。
2,进入购物车的按钮一般都放在首页,列表页。。。任何用户可能需要进入购物车进行结账的地方。也就是说,购物车是非常重要的结账通道。如果在没有一键购买的应用中,那么它就成了支付的关键路径。参考多个APP的设计,首先购物车按钮放在了所有商品浏览相关的页面,比方商品列表,电商首页,商品详情。其次,进入购物车的按钮要小,不能影响用户浏览商品啊。最后,按钮又要醒目,常用的房间就是加显眼的角标了。
3,什么时候将商品从购物车里移除。只有当形成订单时,我们才把商品从购物车里移除。
4,关于购物车的数据保存问题。将商品添加到购物车时还不需要用户登录,如果用户登录了,那么购物车内容就要算给该用户;也就是说用户及时登录到了其他手机上,也能看到他的购物车内容。这里就存在一个购物车内容认领的问题,没有登录时的购物车内容只有在当前手机才能看到。一旦用户登录,该用户就相当于认领了购物车内容,全部归属于当前用户。
5,价格的计算问题:加入购物里的商品价格可能随时变化,甚至商品会被下架。我是这么考虑这个问题,商品的价格需要通过类似价格中心去实时获取,也就是说购物车里商品的总结会实时在变。库存在变,加购物车时可能库存充足,你买了10件,但在之后进入购物车开始结账时,可能商品库存不足了,只能动态调整可以购买的商品数量。关于无效的商品,比方已下架或者已删除,库存不足,这样的商品仍然不能直接从购物车里的悄悄删除,而是将该商品标示为已无效状态,让用户自行处理。这里把握的一个通用的原则,类似用户收藏的,关注的帖子等等,这就属于用户的私有数据,不能因为帖子删除了,就将其从用户收藏里悄悄删除,用户必须有个知情权。
6,如何退出购物车,回到商品页面也是非常有讲究。各位产品细细琢磨:)
再来说说开发设计,这里有产品会忽略的点,当然也有产品不会去考虑的点如性能问题:
1,其实我最担心的是,调整购物车里某个商品的购买个数的操作,这个操作的成本很低,用户只要拼命的点+或-按钮就可以调整数量;我们知道如果要将每次操作的结果都更新到服务器端的话,很有可能你上次的更新请求还没响应,你就又按下了+操作。通过抓包分析淘宝里的实现原理,发现你在不断按+按钮时淘宝没有发出更新请求,当你停下不再按+按钮时,淘宝客户端才发出更新请求。可想而知,请求类似这样 setCount。
2,重复商品的合并,思考这样一种情况:如果你购买的一个商品已经在购物车里,你又选择加入了购物车,那么这时你要做的只要将商品数量累计上就可以了。
3,开发了最麻烦的事就是数据保存在多处,如何解决数据之间同步的问题。你会说你们没有用分布式数据库,也没有用数据缓存,哪里来的的数据同步。其实数据同步的问题存在于所有的B/S和C/S系统中。想象一个这样的情况,你打开了一个商品详情页面,一直保持页面打开,就是不操作;这时即时商品被下架了,你这边看到还是显示在页面上。这就是一个数据同步的问题,你打开了页面相当于获取了数据的拷贝,同时数据库里还保存了一份。这时所有APP开发,特别是服务器端开发都需要考虑的问题。希望这个概念能让大家脑洞大开 哈哈。
4,说问题3,是为了引出问题4。如果同一个用户同时登录在两台手机上,都在购物车里对某个商品做+-操作会产生什么反应。体验淘宝APP的结果,操作都是基于对本地数据为基础的推导。比方,当前手机上,商品A库存是10件,那么+操作,相当于会让服务器更新为 setCount 11。而不会管这时其实数据库该用户购车内本商品的个数是多少。
说了这么多,给出个标准答案:
cat.getGoodsList 返回:购物车商品列表
cat.setGoodsCount, 传入参数 goodsId, count,返回:该购物车内商品信息;处理逻辑:如果该商品不存在,则添加该商品;如商品已存在,则将数量设置为传入的count值。
cat.addGoodsWithCound, 传入添加的goodsId,count 返回:该购物车内商品信息;处理逻辑,如果该商品存在,则数量为当前数量+count。如果不存在,则添加该商品,并将数量设置为count。
cat.removeGoods,传入参数
另外,下订单成功后,服务器会查询该用户购物车,删除比对上的商品。
最后对比一下购物车和订单在业务需求上的区别:订单一旦形成,相当于平台和用户之间形成的一个契约,是不能在改变的,尤其是订单总价,送货地址,还有用户 的额外要求(一般作为留言)。且会导致商品减库存。此外防止用户恶意拍下,一般会在拍下后一直不付款的订单进行超时取消订单。相当于用户不履行合同,平台 将合同取消,再归还库存。对于秒杀商品一般15分钟不支付就会取消。购物车不同于订单,算不上是一个契约,仅仅是提供给用户的一个便捷功能。用户完成选品 后,可以一次性付款。
版权声明:本文为博主原创文章,未经博主允许不得转载。