二、最简单的购物车下单流程

购物车下单和商品直接购买,有很大的不同,其中最大的不同点就是购物车下单可以同时购买多种商品,并且购物车中的商品还会按照不同的属性进行分组,生成不同的订单,对应不同的发货流程,这里先不考虑那么复杂的场景,先从简单的设计。
首先,我们要知道,在普通的电商项目中,每个用户都有唯一一个购物车(shopping_cart),购物车会显示商品数量,商品总价格等信息,那么来设计一下购物车的表结构

字段 类型 说明
id num 购物车id
item_count num 商品总数
selected_item_count num 选中的商品总数
total_price num 购物车中选中商品的实际总价格
real_total_price num 购物车中选中商品的优惠后总价格
order_count num 购物车中订单数量
select_order_count num 购物车中勾选的订单数量
uid num 用户id

上面对应的就是一个简单的购物车字段结构,由于先不考虑商品分组,优惠信息等情况,暂时先设计这些字段

按照上面的设计,当一个用户创建的时候,就会产生一个专属于这个用户的购物车
初始化的购物车信息

{
  "id": 1299477521234563,
  "item_count": 0,
  "selected_item_count":0,
  "total_price": 0,
  "real_total_price": 0,
  "order_count": 0,
  "select_order_count": 0,
  "uid": 123456
}

下面我们要将商品添加到购物车中
顺着文章一的设计,添加商品的时候,生成一个订单order,并将相应的价格信息更新到购物车数据中,并且正常情况下添加进购物车的订单都是被选中的,此时我们要在order中追加两个字段

字段 类型 说明
shopping_cart_id num 购物车id(通过该id将购物车和订单关联)
is_selected num 订单是否被选中(0=未选中,1=选中)默认是1

此时将一个商品添加进购物车后,相应的生成的订单数据结构如下

{
  "id": 1299477521523456,
  "state": 0,
  "item_id":1299477521563661,
  "name": "可口可乐",
  "sub_name": "可口可乐真好喝",
  "title_pics": ["我是图片连接","我是图片连接"],
  "total_count": 10,
  "item_price": 1,
  "settlement_price": 100,
  "uid": 123456,
  "shopping_cart_id":1299477521234563,
  "is_selected":1
}

此时的购物车数据如下

{
  "id": 1299477521234563,
  "item_count": 10,
  "selected_item_count":10,
  "total_price": 100,
  "real_total_price": 100,
  "order_count": 1,
  "select_order_count": 1,
  "uid": 123456
}

由于这里还未设计优惠信息,所以total_pricereal_total_price的值是相同的,后续关于优惠信息的文章会讲解这一部分
接下来对购物车的操作分一下几种情况

  • 将多种商品添加进购物车,创建新的order并更新购物车中的数据信息
  • 删除某个商品,将对应的order删除并更新购物车中数据信息
  • 对购物车中的订单进行选中或未选中操作做,更新order中的is_selected值,并对购物车的数据信息进行更新
  • 修改某个商品数量,更新对应order信息,并更新购物车数据信息

接下来是将选中的商品从购物车中提取出来,生成即将支付的订单,此时或许已经发现了问题,我们不能再生成order了,一方面order的设计不满足多种商品的订单要求,另一方面再生成order,无法区别购物车订单和支付订单的区别,这时要再设计一种订单,姑且叫总订单(user_order),实际上前后端展示在用户界面的是这个user_order的数据信息

字段 类型 说明
id num 总订单id
uid num 用户id
state num 订单状态:-2=订单支付失效(未在指定时间内支付);-1=删除;0=在购物车中;1=待付款;2=已支付(代发货);3=已发货(待收货);4=待评价;5=交易完成;6=已取消;7=维权中(退款中);8=订单关闭(全额退款);9=部分退款(维权成功);10=退款拒绝(维权失败)
total_price num 订单总价格(含商品费用,运费,保险费用等,再减去优惠的价格)
item_total_price num 商品总价格
ship_fee num 邮费
sub_order_count num 子订单数量

这里只是列举了重要字段,实际上user_order中还有很多信息,例如优惠减免价格、是否支持退货、收货地址id(对应查找收货地址信息)、改签状态等
那么,当从购物车中提取商品订单order生成总订单user_order的时候,我们生成的user_order大致是这样的

{
  "id": 1299477521238888,
  "uid": 123456
  "state": 1,
  "total_price":105,
  "item_total_price": 100,
  "ship_fee": 5,
  "sub_order_count": 1
}

此时购物车勾选出的商品订单order中要再追加一个字段

字段 类型 说明
user_order_id num 总订单id(通过该id将总订单和子订单关联)

那么我们总结一下,当从购物车中选出商品,形成支付信息的时候要做的操作

  • 生成总订单user_order,再次强调,实际前后台显示在用户面前的是user_order中的信息,这个很重要
  • 更新order中的state字段为1(表示订单已经不是购物车订单),并在order中追加字段user_order_id
  • 更新shopping_cart相关数据信息

注意事项:从购物车中挑选出商品形成user_order的时候,此时user_orderorder的具体状态state字段要看具体的产品需求,只有真正的生成未支付订单时state字段才会等于1,并且更新shopping_cart信息

此时再做接口设计

  • 只要根据uid就可以查出相应的购物车信息shopping_cart以及根据order中的state字段(等于0)和shopping_cart_id查出购物车中的商品订单order用于给前端展示
  • 根据uid可查出生成的总订单信息user_order以及根据order中的user_order_id查出总订单中对应的子订单order用于给前端展示

注意:user_order中没有具体的商品信息,只有对应的价格等信息
接下来的付款、发货、收货、评价等对订单操作的流程,只要更新对应的状态state字段即可
结合前面的文章一,或许我们对于两种不同的购物流程给前端同学返回的数据结构是不一样的,文章一直接购买只返回一个order,而购物车下单却返回一个user_order外加多个order,这样似乎对前端开发很不友好,同样都是订单,却有不同的数据结构
综合考虑,为了追求数据结构的一致性,在直接下单的购物流程中也要生成user_order,这样数据结构的一致性对开发来说是很好的一件事情
此时,我们要在orderuser_order中都各自追加一个字段

order中追加的字段

字段 类型 说明
order_type num 订单类型:0=购物车订单;1=立即购买订单;2=虚拟电商购物车;3=虚拟电商立即购买;199=改签订单;200=优惠券(主要用于后端逻辑)

user_order中追加字段

字段 类型 说明
user_order_type num 订单类型:0=实物购物车产生的用户订单;1=实物立即购买产生的用户订单;2=虚拟购物车产生的用户订单;3=虚拟立即购买产生的用户订单; 199=改签订单;200=优惠券(主要用于后端逻辑)

其中的虚拟物品购买暂时先不做考虑,值区分购物车购买和直接下单购买
另外说一下这两个字段的其他用处
除了简单的区分订单类型之外,在用户进行下单操作的时候,由于这两个字段的存在,每次用户下单我们只要update原有的user_order即可,而不用每次都new数据
例如,第一次我们下单某商品,new一个user_order数据,其中

{
  "state": 0,
  "user_order_type": 1,
  "uid": 123456
}

这样,只要订单的state状态不变(即订单未变成待付款订单),每次客户下单的时候,只要根据stateuser_order_typeuid查出相应的user_order更新即可,而不是每次客户下单都要new一个新的user_order,也就是说每个用户uid会只有一个state等于0的user_order,只有当state状体变为1才会再创建一个state等于0的新user_order,这样做似乎更合理(注意:订单状态state由0变成1的操作时不可逆的)

另外在创建数据的时候,尽量保证创建的数据都有用,而不是创建很多临时数据,用后在删除,这样做风险很大。后台真正操作删除数据,应该是在用户的手动物理删除操作的时候。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,653评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,321评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,833评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,472评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,306评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,274评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,658评论 3 385
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,335评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,638评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,697评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,454评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,311评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,699评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,986评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,254评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,647评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,847评论 2 335

推荐阅读更多精彩内容