开发设计laravel-shop电商

05 购物车&订单模块

2019-08-04  本文已影响15人  阳光的小mi

1. 前言

购物车是电商必不可少的功能,课程中电商系统把商品下单的唯一入口放在了购物车商品列表,也就是说只能在购物车商品列表页面选择商品下单购买。课程传送门
本模块功能包括:

2. 功能分析

2.1 购物车

2.1.1 需求分析

附功能效果图如下:


商品加入购物车-效果图

2.1.2 表设计

CREATE TABLE `cart_items` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT, # 自增ID
  `user_id` int(10) unsigned NOT NULL, # 所属用户ID
  `product_sku_id` int(10) unsigned NOT NULL, # 选择的商品SKU
  `amount` int(10) unsigned NOT NULL, # 商品数量
  PRIMARY KEY (`id`),
  KEY `cart_items_user_id_foreign` (`user_id`),
  KEY `cart_items_product_sku_id_foreign` (`product_sku_id`),
  CONSTRAINT `cart_items_product_sku_id_foreign` FOREIGN KEY (`product_sku_id`) REFERENCES `product_skus` (`id`) ON DELETE CASCADE,
  CONSTRAINT `cart_items_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

课程中也有提到,表名和字段名最好能做到见名思意,过个一年半载,看到表名/字段名就能想起它的含义。这里购物车的表名是cart_items,准确地说,我们建的不是购物车表,一个用户一个购物车,一个购物车可以存放多样商品,我们建的是购物车商品表,就像前面的商品收藏一样,只是在这里,我们形象地理解这些待买的商品的合集叫做购物车,因此表名cart_items是购物车中商品项的意思。

2.1.3 代码借鉴

课程中,购物车是登录之后才能操作,直接用数据库存储,实现比较简单。可以思考拓展一下用户在登录/非登录状态下购物车数据怎么存放,多端购物车数据怎么同步?
可以参考以下思路:
大型电商项目购物车的实现
购物车实现及原理(仿京东实现原理)

2.2 订单

订单是电商系统必不可少的一环。与之相关的有商品模块、支付模块、物流模块,不同商品种类,不同支付方式,不同物流公司的处理方式都不一样,因此在编码设计和表设计上需要考虑清楚。

2.2.1 需求分析

购物车下单界面-效果图

2.2.2表设计

# 订单表
CREATE TABLE `orders` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT, # 自增ID
  `no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 订单号
  `user_id` int(10) unsigned NOT NULL, # 所属用户ID
  `address` text COLLATE utf8mb4_unicode_ci NOT NULL, # 地址快照
  `total_amount` decimal(10,2) NOT NULL, # 订单总金额
  `remark` text COLLATE utf8mb4_unicode_ci, #备注
  `paid_at` datetime DEFAULT NULL, # 支付时间
  `payment_method` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, # 支付方式
  `payment_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, # 第三方支付单号
  `refund_status` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', # 退款状态
  `refund_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, # 第三方退款单号
  `closed` tinyint(1) NOT NULL DEFAULT '0', # 订单是否关闭
  `reviewed` tinyint(1) NOT NULL DEFAULT '0', # 订单是否评价
  `ship_status` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', # 物流状态
  `ship_data` text COLLATE utf8mb4_unicode_ci, # 物流信息
  `extra` text COLLATE utf8mb4_unicode_ci, # 其他数据
  `created_at` timestamp NULL DEFAULT NULL, # 订单创建时间
  `updated_at` timestamp NULL DEFAULT NULL, # 订单更新时间
  PRIMARY KEY (`id`),
  UNIQUE KEY `orders_no_unique` (`no`),
  UNIQUE KEY `orders_refund_no_unique` (`refund_no`),
  KEY `orders_user_id_foreign` (`user_id`),
  KEY `orders_coupon_code_id_foreign` (`coupon_code_id`),
  CONSTRAINT `orders_coupon_code_id_foreign` FOREIGN KEY (`coupon_code_id`) REFERENCES `coupon_codes` (`id`) ON DELETE SET NULL,
  CONSTRAINT `orders_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

# 订单子项表
CREATE TABLE `order_items` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT, # 自增ID
  `order_id` int(10) unsigned NOT NULL, # 所属订单ID
  `product_id` int(10) unsigned NOT NULL, # 商品ID
  `product_sku_id` int(10) unsigned NOT NULL, # 所选商品SKU
  `amount` int(10) unsigned NOT NULL, # 数量
  `price` decimal(10,2) NOT NULL, # 价额
  `rating` int(10) unsigned DEFAULT NULL, # 评分
  `review` text COLLATE utf8mb4_unicode_ci, # 评价
  `reviewed_at` timestamp NULL DEFAULT NULL, # 评价时间
  PRIMARY KEY (`id`),
  KEY `order_items_order_id_foreign` (`order_id`),
  KEY `order_items_product_id_foreign` (`product_id`),
  KEY `order_items_product_sku_id_foreign` (`product_sku_id`),
  CONSTRAINT `order_items_order_id_foreign` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE,
  CONSTRAINT `order_items_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE,
  CONSTRAINT `order_items_product_sku_id_foreign` FOREIGN KEY (`product_sku_id`) REFERENCES `product_skus` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=188 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2.2.3 代码借鉴

订单这一块的代码质量很高,值得反复推敲。包括:

上一节: 04 商品模块-进阶 众筹
下一节:06 支付模块

上一篇下一篇

猜你喜欢

热点阅读