电商系统概要设计

news2024/11/16 17:35:45

设计一个最小化的电商系统,理清楚电商系统的架构。目前唯一能确定的是,老板要做一个电商系统。具体做成什么样,还不清楚。你需要和老板讨论需求。

你:“咱们要做的业务模式是C2C、B2C还是B2B呢?”

老板:“什么B?什么C?我不懂你们那些技术的东西。”

你:“这么说吧,你要山寨,啊不对,做一个某宝网,还是某东网,还是某848网呢?”

老板:“不都是一样的么?有什么区别?你赶紧做一个出来我看看不就知道了?!”

有没有感觉似曾相识?作为研发谁没碰到过几个啥也不懂的需求方不是?那这种情况下,你怎么办呢?

在需求还不太明确的情况下,比较可行的方式就是,先把那些不太会变化的核心系统搭建出来,尽量简单地实现出一个最小化的系统,然后再逐步迭代完善。

电商系统的核心流程

遵照软件工程的一般规律,我们先从需求阶段开始。如何来做需求分析?理想情况下,应该由系统分析师或者是产品经理来承担这个任务。但现实很骨感,绝大多数情况下,你得到的所谓的“需求”,就是一两句话。需求分析的工作实际上就落在了开发者身上。

很多项目交付以后,还要改来改去,用户不满意,开发者很痛苦,其实就是缺失了需求分析这个步骤。所以,为了自己,每一个开发者都应该掌握一点需求分析的方法。

开发者怎么来做需求分析?这里面我们不讲那些做需求分析的方法和理论,只告诉你最重要、最关键的一个点。

不要一上来就设计功能,而是先要回答下面这两个问题:

  1. 这个系统(或者是功能)是给哪些人用的?
  2. 这些人使用这个系统来解决什么问题?

这两个问题的答案,我把它们称为业务需求。在我们将要设计的这个电商系统中,它的业务需求是什么?电商的业务,每个人都熟悉,很容易回答这两个问题。

电商系统给哪些人用?

首先得有买东西的人,我们叫“用户”,还得有卖东西的人?我们叫“运营人员”。还有什么人会用这个系统?老板啊!你记住,你在设计任何一个系统的时候,千万不要把老板或者是领导给忘了,他们是给你钱的人,他们的意见非常重要!

用户、运营和老板,分别用电商系统来干什么?

用户用系统来买东西,运营用系统来卖东西,老板需要在系统中看到他赚了多少钱。这两个问题的答案,或者说是业务需求,稍加细化后,可以用下面这个图来清晰的表述:

img

这个图在UML(统一建模语言)中称为用例图(Use Case),是需求分析的时候你需要画的第一张图。它回答的就是,业务需求中的那两个关键的问题,这个系统给谁用?他们用这个系统解决什么问题?

一般来说,业务需求和我们要设计的系统关系不大。为什么这么说呢?你可以看一下上面这个图里面的用例,放在传统的商业企业里面,比如一个小杂货铺、一个线下实体商场商店或者一个做电视购物的公司,是不是也是适用的?所以做业务需求的主要目的,是理清楚业务场景是什么样的。

然后我们来分析电商系统的流程。显然,一个电商系统最主要的业务流程,一定是购物这个流程。你应该很容易就能把这个流程分析出来,它的流程图是这样的:

img

所有的电商几乎都是这样一个流程,我和你一起来看一下这个流程。

流程从用户选购商品开始,用户先从你的App中浏览商品;找到心仪的商品之后,把商品添加到购物车里面;都选好了之后,打开购物车,下一个订单;下单结算之后,就可以支付了;支付成功后,运营人员接下来会给每个已经支付的订单发货;邮寄商品给用户之后,用户确认收货,到这里一个完整的购物流程就结束了。

根据流程划分功能模块

细化之后的流程,绘制成了下面这个时序图(Sequence Diagram):

img

我们一起看下这个时序图中的每个步骤。

  1. 用户开始浏览商品,需要有一个商品模块来支撑,给用户展示商品的介绍、价格等等这些信息。
  2. 用户把选好的商品加入购物车,这个步骤,也需要一个购物车模块来维护用户购物车中的商品。
  3. 用户下单肯定需要一个订单模块来创建这个新订单。订单创建好了之后,需要把订单中的商品从购物车中删除掉。
  4. 订单创建完成后,需要引导用户付款,也就是发起支付流程,这里需要有一个支付模块来实现支付功能,用户成功完成支付之后,需要把订单的状态变更为“已支付”。
  5. 之后运营人员就可以发货了,在系统中,发货这个步骤,需要扣减对应商品的库存数量,这个功能需要库存模块来实现,发货完成后,还需要把订单状态变更为“已发货”。
  6. 最后,用户收货之后,在系统中确认收货,系统把订单状态变更为“已收货”,流程结束。

这个流程涉及到的功能模块有:**商品、购物车、订单、支付和库存,**这几个模块就是一个电商系统中的核心功能模块。

当然,仅仅有这几个模块还是不够的,因为我们只分析了“购物”这个最主要的流程,并没有完全涵盖业务需求中的全部用例,比如:运营人员进货、老板查看报表这些用例还没有覆盖到。

相比购物这个流程,剩下的几个用例和流程都没那么复杂,用同样的方法就可以把其他功能模块分析出来。在这里我们就省略分析过程,直接给出我们电商系统的功能模块划分:

img

UML中的包图(Package Diagram)来表示。整个系统按照功能,划分为十个模块,除了购物流程中涉及到的:商品、订单、购物车、支付、库存五个模块以外,还补充了促销、用户、账户、搜索推荐和报表这几个模块,这些都是构建一个电商系统必不可少的功能。我们一个一个来说每个模块需要实现的功能。

  • 商品:维护和展示商品信息和价格。
  • 订单:维护订单信息和订单状态,计算订单金额。
  • 购物车:维护用户购物车中的商品。
  • 支付:负责与系统内外部的支付渠道对接,实现支付功能。
  • 库存:维护商品的库存数量和库存信息。
  • 促销:制定促销规则,计算促销优惠。
  • 用户:维护系统的用户信息,注意用户模块它是一个业务模块,一般不负责用户登录和认证,这是两个完全不同的功能。
  • 账户:负责维护用户的账户余额。
  • 搜索推荐:负责商城中,搜索商品和各种列表页和促销页的组织和展示,简单的说就是决定让用户优先看到哪些商品。
  • 报表:实现统计和分析功能,生成报表,给老板来做经营分析和决策使用。

这里面需要特别说一下促销模块,它是电商系统中,最复杂的一个模块。各种优惠券、满减、返现等等这些促销规则,每个都非常复杂,再加上这些规则叠加计算,常常是复杂到连制定促销规则的人都搞不清楚。

所以每个电商公司无一例外都爆出过,因为促销规则制定失误,而产生非常便宜的“羊毛单”,让精明的消费者薅了“羊毛”。不过五花八门的促销是提升销售最有效的手段,肯定不能因噎废食。

作为系统设计者,我们需要把促销的变化和复杂性封禁在促销模块内部,不能让一个促销模块把整个电商系统都搞得非常复杂,否则就很难去设计和实现。

可行的做法是,把促销模块与其他模块的接口设计的相对简单和固定,这样系统的其他模块就不会因为新的促销玩儿法而改变。

在创建订单时,订单模块把商品和价格信息传给促销模块,促销模块返回一个可以使用的促销列表,用户选择好促销和优惠,订单模块把商品、价格、促销优惠这些信息,再次传给促销模块,促销模块则返回促销价格。

最终生成的订单中,只记录订单使用了哪几种促销,以及最终的促销价就可以了。这样,不管促销这个模块的玩儿法怎么变化,订单和其他模块的业务逻辑不需要随之改变。

至此,我们就完成了一个电商系统的概要设计。

总结

首先,系统的角色是:用户、运营人员和老板。这三个角色对电商系统的需求是:用户使用系统来购物,运营人员负责销售商品,老板关注系统中经营数据。电商系统最核心的流程就是用户购物的流程,流程从用户浏览选购商品开始,加购、下单、支付、运营人员发货、用户确认收货,至此流程结束。

细化这个流程之后,我们可以分析出,支撑这个流程几个核心的功能模块:商品、订单、购物车、支付和库存。此外,还需要促销、用户、账户、搜索推荐和报表这些必备的功能模块支撑,才能构成一个完整的电商系统。

我还和你分享了作为一个开发者,你在做需求分析的时候,需要把握的一个要点:不要一上来就设计功能,而是要先理清业务需求,也就是这节课反复强调的两个问题:这个系统是给哪些人用的?他们分别用这个系统来解决什么问题?这样可以确保你做出来的系统,大体上不会偏离用户的预期。

最后,在讲解系统功能模块划分的时候,我们说了一个有效减少系统复杂度的设计经验。那就是,如果系统业务是复杂而多变的,尽量识别出这部分复杂业务的边界,将复杂封禁在一个模块的内部,避免这种复杂度扩散到整个系统中去。

这节课是我们专栏的课前加餐,目的是为了让你了解电商的组成模块。在后续的课程中,我将和你一起经历这个电商系统在从小到大的发展过程中遇到的存储技术问题,并一起解决它。

FAQ

  • 使用什么编程语言和技术栈?
  • 需要哪些第三方的框架和云服务?
  • 我们最关心的存储系统该怎么选型?

针对促销的话,还有一个点在实际运营的电商系统中,也需要经常考虑到。订单中要存储每个商品所均分的促销价。如A商品100元,B商品100元。用户买了一件A+一件B,激发了一个促销满200减10元,每个商品均摊5元。核心也是为了再做单件售后时,计算出首先对应的金额。

我们小公司设计是这样,就是老板这个角色就是超级用户或者是你说的超级运营,除了查看报表什么的,还有其他上货的功能也有。困惑的是,购物车这个一次性几个商品,是一个订单还是几个商品一个订单,中间掺杂拼单优惠这些怎么搞,主要问题是客户买完了,突然说这个我不要了,或者要退货退钱。
该怎么设计订单,关于购物车订单,一次好多个商品,还有就是带来的优惠折扣怎么搞,按照产品的想法这个要这样,那个要这样,感觉在给自己埋坑啊。

促销优惠的复杂度都封禁在促销模块里面,让保持促销对外的接口简单。

像你这种情况,促销需要提供几个服务:

一是哪些促销可用:输入是一堆商品和用户ID,促销服务返回可用的促销:比如满减、优惠券之类的。

一个“算价”服务,输入是:一堆商品和使用的一堆促销,促销服务需要验证这些促销是否都可以使用,有没有冲突之类的,如果可用,返回的是计算完成的促销价。

这个促销价不仅包括使用促销之后的总价,还要包含每个商品的“实际优惠价(不显示给用户)”,保证:促销后的总价=Σ所有商品的实际优惠价。这个价格就是用完促销之后,每个商品的实际价格,后续退货、计算成本收益,都以这个价格为准。

这样对于购物车和订单来说,处理就比较简单了,不管你促销怎么玩儿,反正最终你告诉我用完促销之后每个商品什么价格就可以了。促销规则变来变去也不用去改订单服务。

所以,到底是下单扣库存,还是发货扣库存呢?一般下单锁库存,发货减库存。

电商系统中如何解决超卖这个问题?看具体的业务场景吧。一般解决超卖问题的方法都是在下单的时候锁定库存,如果订单取消再释放库存。

“用户模块一般不负责用户登录和认证,这是两个完全不同的功能" 这该怎样理解?
我们在做登录认证时会从用户库查询匹配、也会有些跟用户相关的别的逻辑。
这里的用户模块主要是维护和管理C端用户信息的模块,用户数据也是业务数据,是电商的重要业务资产,所以最好不要登录认证的安全功能做在一起。

如果用户下单之后,一直没有取消订单,是不是有一个阈值,比如说30分钟,用户还没有支付,这个订单相应的也要失效,同时释放库存。

是的,所以你看很多抢购的订单,如果你下单后不付款,有效期都非常短,为的就是尽快释放库存,给其它人抢购。

云服务建议采用阿里云,阿里云的产品种类比较多,基本能满足电商系统的开发需要。
图片视频等文件存储采用阿里云的对象存储OSS。
商品搜索采用阿里云的开发搜索OpenSearch,它提供了专门针对电商的分词支持。
订单支付一般对接微信支付和支付宝支付。
总之,初创型公司要求是快速出成品,采用现成的服务比较便捷。

开始阶段一般选java技术栈,如果团队能驾驭别技术栈也是可以的,前端可能只做小程序,数据库使用mysql或最熟悉的。图片视频存储直接购买公有云产品,还需要CDN,框架如第三方支付SDK 等,还要申请一堆东西域名、证书…

对小规模的团队,这是一个非常务实合理的选择。

库存变化这块儿,我们是有一个总库存和一个冻结库存,当前可用库存是 总库存-冻结库存,用户购买一件商品时,下单后冻结库存+1,然后在支付成功后总库存和冻结库存分别-1;订单超时未支付的话,冻结库存-1,总库存不变。

发货后再减去相应的库存,这样不会造成超卖吗?

下单的时候需要锁定库存,配合发货的时候减库存,才不会超卖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CES 2023:NVIDIA发力元宇宙与汽车市场

作为全球规模最大、影响最为广泛的国际消费电子展,2023年的CES(Consumer Electronics Show)在美国拉斯维加斯如约而至。众所周知,作为全球消费电子产业发展的风向标,每年的CES都汇聚了各大科技企业最先进的技术与产品。…

Renesas setting-文件导入

导入工程 1.1, 文件\从文件系统选中打开项目… 1.2, 打开xpg_app文件 链接文件 2.1,选中项目\右键\属性 2.2,删除文件(在不同电脑中绝对路径不同) 属性\路径和符号, 源位置(delete C 文件)&…

在未联网的计算机中部署 yum 源和 EPICS 环境

1. 基本背景 EPICS 软件仓库:192.168.206.234:8888 安装方式:yum 2. 配置跳板机 跳板机功能:借助ssh 隧道服务进行端口转发,使未联网的计算机能够访问软件仓库。 将未联网的计算机与一台申请了无线校园网的笔记本电脑进行有线…

PCB结构和谐振(一)

本文构建了包括不同的旋转角度、不同的叠层和两种不同布线方法(W 形和蛇形线)的测试手段,对应于这些设计的谐振是通过 VNA 测量获得的。然后,使用仿真方法来帮助我们理解这些实验结果。为了消除仿真与实验之间的差异,研…

【chatGPT】一位聊天永远秒回的朋友

目录一、chatGPT介绍二、通过猿如意体验三、在openAI官网体验2.1注册openAI2.2使用和问题说明一、chatGPT介绍 ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的…

债务豁免,只是中昌数据的一次“回光返照”?

‍‍数据智能产业创新服务媒体——聚焦数智 改变商业因为经营不善,中昌大数据股份有限公司(以下简称“中昌数据”)已被实施退市风险警示,1月3日,中昌数据发布公告称收到两位债权人的《债务豁免函》,对中昌…

线程安全中的原子性,有序性和可见性

对于Java并发编程,一般来说有以下的关注点: 线程安全性,正确性。 线程的活跃性(死锁,活锁) 性能 其中线程的安全性问题是首要解决的问题,线程不安全,运行出来的结果和预期不一致,那就连基本要…

计算机的发展史与计算机硬件组成

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.计算机的发展史 1.计算机发展的四个时代 二.计算机硬件组成 …

#D. Journey之二

一,题目Description给出一棵树N个点及数字K接下来N-1行描述有关边的开始点,结束点.保证图中不会有环接下来K个数字,代表你要走过的点的编号.当然你可以自己选择出发点及行进的路线不一定按给定编号顺序前行,求走过的最短距离。FormatInput第一行给出N,K。…

工具及方法 - 文件正在被使用,无法改名或删除怎么办

有时我们想重命名或删除一个文件时,会提示错误,提示文件被占用。 比如提示:“The action can’t be completed because the folder is open in another program“。 或者: 或者: 就是因为有进程锁定(process is lock…

004-Ensp-实验-配置DNS

实验要求 1. 在PC2中Ping www.pc1.com 可以访问到PC2 2. 在PC1中Ping www.pc2.com 可以访问到PC2 网络结构 实验步骤 #需要开启DHCP [Huawei]interface g0/0/0 [Huawei-GigabitEthernet0/0/0]dhcp server dns-list 192.168.0.100 测试

人工智能:数字图像类型和常见格式介绍

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

【C语言】-深入内存带你看数据的存储

🎇作者:小树苗渴望变成参天大树 🎉 作者宣言:认真写好每一篇博客 🎊作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 数据的存储🧨 前言✨一、数据类型…

007-Ensp-实验-配置静态路由

实验要求 PC1 可以访问到 PC2 网络结构 实验步骤 1. AR1 G0/0/0 - G0/0/1 配置IP 2. AR2 G0/0/0 - G0/0/1 配置IP 3. PC1 PC2 配置IP/GateWay 4. AR1 配置静态路由表 ip route-static 192.168.1.0 255.255.255.0 192.168.5.2 5. AR2 配置静态路由表 ip route-static 19…

Linux虚拟机克隆后网卡名从eth0变成eth1

文章目录一 系统环境二 问题发现三 解决过程一 系统环境 原本被克隆的主机是 rhel6.9 的操作系统。 二 问题发现 对 rhel6.9 的主机克隆后,发现无法SSH远程连接,从而发现可能是网卡的问题需要解决。 首先检查网卡服务是否启动 发现network服务是正常运…

java在线视频播放系统视频网站影视网站电影电视剧播放网站源码

简介 ssm开发的视频网站。本项目主要包括了视频展示和查询功能,用户中心,积分管理,管理员管理等功能。 演示视频 https://www.bilibili.com/video/BV1tT4y1N7t8/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 技…

【408篇】C语言笔记-第二十二章(文件的操作)

文章目录第一节:文件操作原理1. C文件概述2. 文件指针介绍第二节:文件的打开与关闭1. 文件打开与关闭常用函数2. 代码实战第三节:文件的读写1. fread函数与fwrite函数2. fgets函数与fputs函数第四节:文件位置指针偏移1. fseek函数…

2023-01-04 clickhouse-编译、开发、测试

https://bohutang.me/2020/06/05/clickhouse-and-friends-development/ 一次偶然的机会,和ClickHouse团队做了一次线下沟通,Alexey提到ClickHouse的设计哲学: The product must solve actual problemAnd do it better than others 用工程思维解决商业问…

人工智能期末试卷

一、简答题(共 24 分) 若将人看成一个信息处理系统,1) 人的智能具有哪些特征?2) 举例说明哪一特征是最重要的并 3) 阐述其与实现通用人工智能的关系。(要求:2、3 小问一定用自己的语言作答!)(8 …

javaweb课程设计-基于SSM框架的疫情数据统计分析系统源码+数据库,可以进行疫情数据录入、疫情数据查询、图表展示

疫情数据统计分析系统 完整代码下载地址:基于SSM框架的疫情数据统计分析系统源码数据库 介绍 疫情数据统计分析系统是一个基于SSM框架的网页端系统,项目中实现的功能如下:用户访问网站可以浏览全国疫情的图表信息,管理员登录后…