自营商城架构杂谈

前言

自营商城在技术层面来说是比较简单的系统,难点一般都在业务逻辑,只要业务逻辑理通顺了,技术实现起来并不难。但是做一个可靠的系统还是需要一定的功夫打磨,毕竟再简单的系统如果没有一定的规划与架构,后续维护与扩展也是一个头疼的问题。以下是我从事商城开发一年多的个人经验,分享给大家一起探讨学习。

技术栈架构图

架构图

详细说明

后台

自营商城最开始开发一般都是小团队进行开发,后台不会有前端工程师的参与,我个人非常推荐使用 ElementUI 进行后台开发(原始引入的方式,非打包),后台程序员参考官方文档就能写出很好看的 UI,结合上 Vue 对于一些复杂的表单页面也会比 jQuery 好写很多。

前台

前台是商城的重要组成部分,一般会先由设计部出设计稿,评审通过后再交给前端进行开发。

  • 商城是一个非常需要 SEO 的网站,所以在技术选型上优先考虑使用框架模板引擎作为基础,对于一些不需要 SEO 的页面(购物车,个人中心)可以使用 Vue 渲染。

  • 对于静态资源的引入会涉及到 CDN 缓存的问题,所以使用 Webpack 对静态资源(css,js)进行打包,而后结合 Laravel mix 进行版本更迭。

  • axios 是替代原有 jQuery ajax 的,他拥有非常完善的请求机制,代码层面也更加语义化。

  • Promise:商城中会涉及到第三方平台数据上报,有时候部分业务逻辑在前台是异步的,这时候就需要用到 Promise。

服务器

软件

服务器基本架构还是 LNMP,但是对于完善的系统应该还需要一些工具的辅助。

  • Redis:作为缓存驱动、队列驱动、锁、Session驱动 等

  • Supervisor: 守护队列进程

  • Shell:切割日志、服务器备份等

  • ElasticSearch:前台搜索引擎、日志收集等

代码

在传统的 MVC 上,多加一层 service ,用于放置业务逻辑,结合公司实际业务需求也可继续划分。

  • Middleware: 用于权限校验、日志采集等全局性的逻辑

  • Job: 不影响主流程的业务逻辑都应该使用队列,例如客户注册成功发送邮件,客户注册是主流程,只要客户注册数据写入数据库成功,就可以跟客户端返回成功,发邮件使用异步进行处理。这样既优化了业务流程,也优化了代码结构

  • Event: 事件是 Job 的升级版,业务初始逻辑可能是客户注册成功发送邮件,后面产品经理又加需求:客户注册成功要发优惠券,如果去注册逻辑那里再派发个优惠券任务是不是显得不够优雅(如果产品经理又双叒叕加逻辑,揍他),这时候就可以使用事件来代替了,只用在主流程结束后派发一个事件,然后再给事件定义监听者即可

  • Exception: 我很少在业务逻辑中看到有人写专门的异常类,但是我十分推荐大家使用异常,每个业务逻辑都应该有自己的异常类,一个方法只有异常跟正常,上层只用放心调用、处理异常就行,不需要关心方法的返回值(返回值必然是成功)

数据库管理

migration 是一个十分符合版本管理的工具,以前使用 SQL 文件进行数据库管理,往往会有数据库跟线上不一致的情况,而且执行起来也麻烦,自从用上了 migration ,一行命令轻松迁移(点一下用一年,超快迁移不要钱),结合上 seed,能够对数据库结构与初始数据进行一个很好的统一。

依赖管理

0202年了,还有人把 vendor 文件夹纳入版本管理(气冷抖)

之前接手一个项目, vendor 文件夹纳入了版本管理,并且更改了框架底层代码(之前程序员说没办法只能改底层,后续出了一堆莫名奇妙的 Bug),说多了都是泪。对于第三方依赖尽量不要去改底层,如果真的是有问题,可以单独拿出来(或者给作者提 issue),一旦更改了第三方依赖,等于说放弃了版本升级、官方 Bug 修复,一切都只能自己来,耗时又费力还不一定搞的好。

权限管理

这里指的是后台系统的权限,商城系统比较简单,使用一般的 RBAC 即可。

异常通知

针对项目中的各种异常,可结合公司办公 IM 软件进行告警,企业微信和钉钉都有群机器人,结合 Laravel 的 Exception Handler 进行异常告警,发现 Bug 的速度大大提升(偷偷改 Bug ,业务还不知道)

定时任务

主要用于订单超时处理、日志切割、数据备份等

代码更新

在部署服务器代码更新完后,更新第三方依赖,打包静态资源,然后 rsync 同步到生产服务器,减少生产服务器宕机时间。

深圳求职中,坑位介绍可私信,笔芯

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 3年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 19

@wongvio 谢谢大佬的评论,最近在忙生活中的事,上社区比较少,回复慢了请多担待,对于大佬说的几点我做几个说明:

  1. 罗列炫耀?并没有什么值得炫耀的东西,我开头文章就说了,商城就是一个很简单的系统,没有什么很高深的技术,我写这篇文章的目的不是去炫耀我会什么,而是总结一下我做这个系统用了有大概哪些东西(这点东西在很多大佬眼中更像事玩具),php、nginx、mysql 这东西难道没用到吗?既然总结当然全部写上,不是说这种东西是“默认”了就忽视掉,至于laravel blade 为什么写上,可能是我没表达清楚,我更想说的是前端开发还是按照 PHP 框架的模板语言去渲染(对SEO友好,简单上手)。
  2. 新手劝退?首先我写的是自己的博客,并不是写的教程,新手能看懂多少,跟我有什么关系呢,况且我写的东西是基础的不能再基础的东西,这都看不明白还谈开发?你说的用 php+div+css+mysql+js 可以开发出很好的商城,那么如果少了其他工具的辅助,你系统的稳定性、拓展性有保证吗?我这篇文章只是分享一下自己在做整个系统所用到的东西,去保证整个系统的可用性,并没有说让大家都这么用,程序员都有自己的思维,把事情做好不就行了吗?
  3. es6 不是语法吗? ES6 是语法,但是用到实际项目中的又有多少了,不去开始就明确项目的语法版本,后续开发能否保证一致性?
  4. webpack 配置好了,基本不用管了,这都算技术栈了??? webpack 配置好了,谁配置的?怎么配置的?官方配置就能满足实际需求吗?不需要人去研究?任何技术都是能够拿来就契合业务的吗?
3年前 评论
wongvio 3年前
aruisi 3年前
Epona

写了 Exception 就要写 try catch, 然而我不想写try catch😂

3年前 评论
Mr-houzi 3年前
minororange (楼主) 3年前
snower 3年前
自由与温暖是遥不可及的梦想

数据表 设计出来了后 可以发出来看看

现在想学习 如何设计表 三范式 反三范式

3年前 评论

在service层抛出异常怎么处理的?

3年前 评论
snower 3年前

@congcong 控制器 catch

3年前 评论
congcong 3年前
Code_Er

搂主可以请教一下 基本业务有那些吗自营商城

3年前 评论

@Code_Er 核心就是订单、产品,做外贸的除了小品类,其他类型网站对会员这块也不会太深入,然后就是营销模块,包括专题页、优惠券等。订单产品这块的技术难点就在库存这块,如何保证库存的一致性。然后其他逻辑就没有什么复杂的

3年前 评论
aruisi 3年前
Code_Er

@minororange 会不会涉及到限时购那些

3年前 评论

@Code_Er 秒杀、限时购、团购等等都属于营销模块,这个根据公司具体业务去开发具体逻辑

3年前 评论
Code_Er

@minororange 搂主可以请教一下你做过限时拍卖嘛

3年前 评论

厉害,架构细节都有

3年前 评论

楼主,库存是用单独的数据库吗?

3年前 评论
snower 3年前

大家有没有这种感觉,好多文章,开头罗列一堆的技术栈,但是其实里面比如JQ,sass这些本来就是非常容易懂的东西,后台的php、nginx、mysql这么写感觉就是为了炫耀费要罗列出来,shell这东西你能用到超过100行吗?

特别是laravel blade都写上了,还有es6不是语法吗?webpack配置好了,基本不用管了,这都算技术栈了???

但是新手一看就懵了,做个商城要那么多东西????根本不需要啊,php+div+css+mysql+js 也能做出很好的商城啊、

最后,我的意思是,我们要对新手友好,这些东西会的人一看就知道是在罗列字数炫耀,但是确阻止了萌新加入。

3年前 评论
可乐加冰 3年前
Inn 3年前
wongvio (作者) 3年前
aruisi 3年前
芝麻开门 3年前

@wongvio 谢谢大佬的评论,最近在忙生活中的事,上社区比较少,回复慢了请多担待,对于大佬说的几点我做几个说明:

  1. 罗列炫耀?并没有什么值得炫耀的东西,我开头文章就说了,商城就是一个很简单的系统,没有什么很高深的技术,我写这篇文章的目的不是去炫耀我会什么,而是总结一下我做这个系统用了有大概哪些东西(这点东西在很多大佬眼中更像事玩具),php、nginx、mysql 这东西难道没用到吗?既然总结当然全部写上,不是说这种东西是“默认”了就忽视掉,至于laravel blade 为什么写上,可能是我没表达清楚,我更想说的是前端开发还是按照 PHP 框架的模板语言去渲染(对SEO友好,简单上手)。
  2. 新手劝退?首先我写的是自己的博客,并不是写的教程,新手能看懂多少,跟我有什么关系呢,况且我写的东西是基础的不能再基础的东西,这都看不明白还谈开发?你说的用 php+div+css+mysql+js 可以开发出很好的商城,那么如果少了其他工具的辅助,你系统的稳定性、拓展性有保证吗?我这篇文章只是分享一下自己在做整个系统所用到的东西,去保证整个系统的可用性,并没有说让大家都这么用,程序员都有自己的思维,把事情做好不就行了吗?
  3. es6 不是语法吗? ES6 是语法,但是用到实际项目中的又有多少了,不去开始就明确项目的语法版本,后续开发能否保证一致性?
  4. webpack 配置好了,基本不用管了,这都算技术栈了??? webpack 配置好了,谁配置的?怎么配置的?官方配置就能满足实际需求吗?不需要人去研究?任何技术都是能够拿来就契合业务的吗?
3年前 评论
wongvio 3年前
aruisi 3年前

要搞清楚罗列和架构的区别,不是列一堆,看起来规整好看就是架构。

3年前 评论

群里看到的,过来说两句,虽然大家几年后看自己的QQ空间都会觉得老脸一红 ,但是没必要特意来评论指出

3年前 评论

每天来论坛吸收一下大佬们分享的一些技术经验 :blush:

3年前 评论
  • 写得挺好的,很全面。
  • 为什么要辩解呢?是工作不饱和,还是 LOL 不香吗?
3年前 评论

我觉得楼主写的挺好的。 可能对于萌新来说,有点劝退,对于大牛来说,这东西没用 但是对于我这种入门不久的,半懂非懂的人很有帮助 我明白了构建商城需要准备那些技术,需要尝试的时候可能会按楼主列的关键词去了解了解。

起码对于我来说,这东西有用,感谢楼主; 如果能列出每个技术在项目中所占的比重就更好啦,这样可以挑重点去了解

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!