1、订单管理

首先是订单表的设计,主要包括订单表和订单详情表,订单表主要包含订单的主要信息,比如订单的编号、总额、数量、状态、收货人信息等。其中收货人信息必须要冗余到订单表中,不能简单用Id进行管理。

订单详情表和订单表是多对一关系,订单详情表主要计量订单中的商品的详细信息,这些信息也要冗余进来,不能通过id进行简单的关联,因为订单一旦生成,这些信息一般不会再允许改变。

订单在用户结算购物车时生成,如果同时购买多个商家的商品,在结算购物车时需要进行分单,同时生成多张订单。

在用户中心,每个用户都可以看到并跟踪自己的订单,进行支付、申请退货、确认收货、评价等操作。商家后台可以看到商家自己的所有订单,进行确认发货操作。而在运营管理平台,可以监控所有的订单,但是不能进行操作。

订单的状态主要包括:待支付、待发货、已发货、已完成、已取消。

生成订单时,应该对库存进行一次校验,防止超卖。

2、购物车

购物车在未登录的情况下,因为没有用户信息,所以这时候如果想要存储购物车信息,只能保存在浏览器客户端。

有两种选择cookie和localstorage,其中cookie,是每个浏览器都有的,既可以通过js操作,也可以随着请求传递到服务器端,在Java里边通过request和reponse对其进行操作,可以设置cookie的有效期、作用域、作用路径等,但是缺点是有可能被禁用,不能跨域,存储量小。

Localstorage[w1] 是html5的本地存储,存储量可以达到5M,本身也不支持跨域,但可以借助其他方式解决,但是他只能通过js操作,不能随着请求传递到后台用Java操作。

无论是cookie还是localstorage都是以key-value的方式存储,因为都没有用户信息,所以我们一般用“固定前缀+商品id”作为key,以商品数量作为value。

加“固定前缀”主要是为了获取购物车列表时方便,value中只保存数量,其他数据展示时再通过id从数据库里边获取,这样是为了保证信息的准确性。如果要追求效率,也可以把要展示的商品信息都保存在value中。

登录以后,购物车一般存储在数据库或者缓存中,之前接触过一个B2B的电商,因为他的金额数量较大,交易周期比较长,购物车中的信息可能会存放很久,这种情况下,还是保存在数据库中比较安全;(主键、用户id、商品id,商品数量)。

这个项目,我们是个B2C的,购物车里边的数据都是临时存储,如果用户加入购物车以后,长时间比如1周还不购物,购物的欲望估计很小了,这时候即使丢失也无所谓。

就像唯品会的购物车,只能存放20分钟,督促用户尽快购买,这种情况下,保存在redis里边是个不错的选择。

Redis是一个第三方缓存数据库,他支持多种(5种)数据格式,也支持持久化。在这里我们使用了他的hash类型的数据格式操作相对比较方便。代码里边通过spring整合redis官方提供的jedis的jar包,来操作redis。

Hash类型存储时,有3个参数。第一个参数key,我们存放“固定前缀_用户id”。第二个参数field,我们存储“产品id”,第三个参数存储“产品数量”;当给购物车存放一个商品或者取出一个商品时,通过用户id和产品id,可以直接获取购物车中商品的数量,然后进行加减操作,在进行覆盖操作就可以。

如果想要获取购物车列表信息,可以直接用“固定前缀_用户id”获取,返回一个map,然后迭代map,获取到购物车中所有的商品信息。

另外,由于用户未登录时,购物车信息只能保存在客户端,不能和用户建立联系,所以如果有其他人借用电脑,购物车信息就可能混乱,这个是不可避免的,如果要考虑这点,最好的方式,就是用户不登录时,不让他操作购物车。

还有就是,如果未登录时,保存了购物车信息,在登录成功后,一定要把购物车信息同步给登录用户。

以上,是我一个新项目中用到的订单管理与购物车功能实现思路,在这里记录下来,帮助有同样需求的小伙伴们,解决方法仅供参考,有什么好的解决方法,可以评论区交流。

我是一名码龄10年的程序员,在这里会分享实在干货,让你少走弯路,成就精彩人生。

分类: 源码分享 标签: 暂无标签

评论

暂无评论数据

暂无评论数据

目录