电商系统设计:运费
注:此设计将运费和服务捆绑在一起,但实际上,运费和服务并无关系,故此设计方案作废!
前言
最近在使用研发一套电商系统(技术栈为SpringBoot3、MySQL、Spring Security、Vue3、Uniapp),研发完成后会发布到GoldPanKit中售卖。研发过程中也参考了目前主流的一些电商系统的设计,发现有些设计思想过于老旧甚至呆板,导致一些核心部分不够灵活。所以我打算对这些不足的地方进行“重构”,在此记录一下重构的想法。想法中并不包含代码实现,只是产品设计和实现思路。
当前主流开源或商业设计的弊端
我们并不了解代码层面他们对运费类型,如满N件免邮,以及在提供商品服务(如礼盒包装、上门安装等)时好不好扩展,但通过研究主流商城系统的后台部分,可以看到很多都没有考虑到商品服务的提供,这样一来,无法满足诸如电视机、空调、定制柜、甚至礼品小物件等需要额外商品服务的商品。而一套商城系统无法支持售卖某些商品,这就是一套商城系统的不足之处!
产品设计
运费的本质是用户购买商品时用户承担的费用,而对于整个商品购买和使用商品的过程中,用户承担的费用不仅仅是运费。还包含诸如上门安装、1年只退不换、3年保修等商品服务的费用。从研发角度来看,运费模块的重点就是对用户承担费用的各种类型的可扩展性。我们可以大致列举几个场景:
- 全国包邮
- 按照地区和件数设定首件和续件的运费价格
- 按照地区和重量设定首重和续重的运费价格
- 按照地区和体积设定首体积和续体积的运费价格
- 满N件包邮
- 额外的服务费用,例如“上门安装”
- 等其它运费模式
以下列举几种商品的运费模式
- 对于生鲜产品(如葡萄),可以使用按照地区和重量设定首件和续件的运费价格。则有:
- 产品产地所在省或临省,首重价格为0,续重5为元;
- 新疆、西藏等偏远地区,首重价格为20元,续重为8元;
- 其它地区,首重价格为5元,续重为5元;
- 对于衣物商品,可以使用全国包邮
- 对于电视机,可以额外配置“上门安装”服务
- 对于礼品物件,可以额外配置“礼盒包装”服务
- 对于电子产品,可以额外配置“1年只退不换”、”3年保修“等服务
- 对于袜子等低利润商品,可以使用满N件包邮
因此,目前主流的“物流设置”或“运费设置”,应该调整为“运费及服务设置”!而运费及服务的设置UI大致如下:


关于自提配送方式的兼容
为了进一步分析自提的处理,我们列举几个场景
- 奶茶店,支持自提和配送
- 超市,支持自提和配送
- 衣物,大部分情况下仅支持配送
可以看出,商家的配送方式基本是一致的,也因此,支持多门店的商城系统的配送方式应该和“运费及服务”一同进行设置。并且自提和配送是允许同时存在的,但这在主流开源和售卖商品中,大都都是二选一。
实现思路
对于后端,运费的计算应该创建一个父类,每种运费类型继承该父类并完成运费的计算逻辑。运费设置和商品服务的存储可以采用一个字段,其结构为JSON。并且为每一种JSON提供对应的BO类,这样可以方便的扩展其它计费方式,如果还需要扩展用户承担的某层面费用,可以继续扩展JSON结构即可。
对于前端,每种计费方式应该单独做成组件或复用组件,然后根据计费类型通过v-if或component动态切换配置组件。
数据库设计如下,其中表名中的 fas 表示 Freight and Service的缩写:
CREATE TABLE `mall_goods_fas` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',`content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '内容',`created_by` int NOT NULL COMMENT '创建人',`created_at` datetime NOT NULL COMMENT '创建时间',`updated_by` int DEFAULT NULL COMMENT '更新人',`updated_at` datetime DEFAULT NULL COMMENT '更新时间',`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已删除',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='运费及服务';
