HbnnMall电子商城系统介绍(功能与技术栈)

        今天在看我个人网站上的文章时,看到了曾经在2020年自己开发的电商系统。那时我已经入职小米有一段时间了,基本已经对各个业务线,各种业务知识有了系统性的了解和学习,所以想自己动手写一个电商系统,以便进一步提高自己的技术。于是趁着疫情那段特殊时期,在业余时间用了几个月的时间把系统写出来了。麻雀虽小,五脏俱全,经过自己几个月的打磨,该有的功能都有了。不过和市面上开源的比,我写的真是相形见绌,都没法供外人展示,当时也纯粹只是为了自己学习。

        当看到自己写的几万行代码时,唯一的感觉就是:这是一场酣畅淋漓的自嗨,虽无大成效但却很痛快。另外一个有意思的是我发现写golang代码会让人难以自拔。毛主席的一首四言诗写道:”与天奋斗,其乐无穷;与地奋斗,其乐无穷;与人奋斗,其乐无穷。“,我改一下:写golang,其乐无穷;写前端,其乐无穷;写代码,其乐无穷。

一、网站介绍

整个系统的架构是这样:

        上面也说了,我的初衷是学习,所以并不像很多现成的电商系统,所有东西都揉到一起写的,而是拆分出多个微服务,采用Dubbo+nacos实现服务注册和发现。

1.首页

首页实现了商品分类导航,轮播图、优惠活动、商品推荐、排行榜、每日新品等。

这块儿就是各种后端服务,聚合形成的数据。

代码示例如下:

 public List<Future<HomeFutureResult>> execute(HomePageRequest homePageRequest){List<HomeGeneralTask> homeGeneralTaskList = new ArrayList<>();//新品展示homeGeneralTaskList.add(new DailyNewProductTask(goodsStatService));//商品推荐RecommendRequest recommendRequest = new RecommendRequest();recommendRequest.setBaseReuest(homePageRequest.getBaseReuest());homeGeneralTaskList.add(new RecommendTask(recommendRequest,recommendService));//排行榜homeGeneralTaskList.add(new TopRankTask(goodsStatService));//秒杀商品列表homeGeneralTaskList.add(new FlashSaleActivityTask());//商品展播图homeGeneralTaskList.add(new BannerTask(goodsStatService));List<Future<HomeFutureResult>> homeFutureResultList = new ArrayList<>();for (HomeGeneralTask homeGeneralTask:homeGeneralTaskList){homeFutureResultList.add(homePageExecutor.submit(homeGeneralTask));}return homeFutureResultList;}

2、商品详情页

        商品详情页涉及到很多,功能包括:

  • 商品左侧图片轮播展示;
  • 商品属性;
  • 商品促销活动;
  • 秒杀页;
  • 标签切换;
  • 立即购买;
  • 加入购物车;
  • 商品详情介绍;
  • 商品评论;
  • 商品参数;
  • 相似商品推荐。

        这个地方我花的时间最多,作为一个后端人员,搞前端的标签切换时,挺痛苦。

        和首页类似,这个地方也是由多个后端服务组成,就是所谓的产品站,这地方是可以做数据异构的。

        代码示例如下:

 public List<Future<GoodsDetailFutureResult>> execute(GoodsDetailRequest goodsDetailRequest, GoodsDetail goodsDetail){List<Future<GoodsDetailFutureResult>> goodsDetailFutureResultList = new ArrayList<>();List<GoodsDetailGeneralTask> goodsDetailGeneralTaskList = new ArrayList<>();//价格库存服务goodsDetailGeneralTaskList.add(new GoodsPriceInventoryTask(goodsDetail,goodsPropmotionService,propInventoryService));//促销活动服务if(Optional.ofNullable(goodsDetailRequest.getIsNeedActDetailInfo()).orElse(false)){goodsDetailGeneralTaskList.add(new GoodsPromotionTask(goodsDetail,goodsPropmotionService));}//商品详情介绍服务if(Optional.ofNullable(goodsDetailRequest.getIsNeedPropDetailIntroduction()).orElse(false)){goodsDetailGeneralTaskList.add(new GoodsIntroductionTask(goodsDetail,goodsDetailRequest,shopGoodImgMapper,djangoUrl));}//商户信息服务if(goodsDetailRequest.getIsNeedMerchantInfo() != null && goodsDetailRequest.getIsNeedMerchantInfo()){//TODO 增加商户信息}//增加shopTagif(Optional.ofNullable(goodsDetailRequest.getIsNeedShopTag()).orElse(false)){goodsDetailGeneralTaskList.add(new GoodsTagTask(goodsDetail,goodTagService));}for (GoodsDetailGeneralTask goodsDetailGeneralTask:goodsDetailGeneralTaskList){goodsDetailFutureResultList.add(goodsDetailExecutor.submit(goodsDetailGeneralTask));}return goodsDetailFutureResultList;}

3、商品搜索

搜索这块儿我使用的是ES进行查询,写了一个定时任务,会定期全量刷新一遍,当然应该还要有一个增量更新的,只不过我没写,同步的示例代码:

简易的搜索代码:

MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name",searchRequest.getName());//提高搜索精度matchQueryBuilder = matchQueryBuilder.prefixLength(3);//默认是ormatchQueryBuilder.operator(Operator.AND);matchQueryBuilder.minimumShouldMatch("75%");searchSourceBuilder.query(QueryBuilders.boolQuery().must(matchQueryBuilder).filter(QueryBuilders.termQuery("status",1)));searchSourceBuilder.from(searchRequest.getPageIndex() == null ? 0 : searchRequest.getPageIndex());searchSourceBuilder.size(searchRequest.getPageSize() == null ? 15 : searchRequest.getPageSize());
//        searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));esSearchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(esSearchRequest,RequestOptions.DEFAULT);

4、购物车列表

购物车实现购物车添加、修改、删除、全选、全部选等等。

购物车的实现都是通过Redia+lua脚本实现的。

5、结算页面

结算页是真正订单结算的页面,让用户知道要付多少钱,这里面涉及到商品,优惠、全局id号(分库分表场景需要全局唯一的订单号)、反作弊、发票、地址等多个服务。还要根据发货主体或者物权主体进行拆单。

6、支付页

订单数据已经生成,并成功写入数据表。接下来商户进行支付操作。超时的会自动取消。

由于支付都是需要企业认证,这里还没实际做支付功能,不过这个不难。

7、个人中心

个人中心包括各状态订单、我的收藏、优惠券、地址管理等等。

8、在线客服

在线客服也花了几天时间写的,使用了LayUi模板 +Python+channels实现了Websocket。

9、单点登录

实现的功能包括:

  • 支持业务系统接入实现第三方登录;
  • 登录方式包括手机验证码登录以及用户名密码登录;
  • token的申请和生成;
  • 通过token解析用户信息,并访问受限资源;
  • token的刷新。

具体可以看我之前写的文章:用户服务之实现单点登录icon-default.png?t=N7T8https://hbnnforever.cn/article/useservicessologin.html

10、秒杀服务

之前小米有个大秒系统,我觉得挺有意思,后来我就想我也整一个,就用Golang写了一个,当然,我写得没那么复杂,就是想体验一把Golang的丝滑。具体代码不展示了,先贴一个工程目录:

二、技术栈

1、Web端

采用的是Python +Django+Vue开发,部署采用Nginx+supervisor+gunicorn的方式;

2、API 网关

采用的是Springboot+Netty开发,目前已实现的功能:

  • 统一前端接口调用,支持HTTP,Dubbo协议;
  • HTTP协议至Dubbo协议的转换;
  • 统一鉴权;
  • 限流,主要借鉴sentinel的思想。

当然,可以看出来,目前实现的网关还比较弱鸡,至少还要加入熔断降级,服务编排,缓存,日志等等。而且,这市面上的API网关太多了,我纯粹是为了学习,实际中我们尽量避免造轮子。

3、后端业务层

用到的技术栈:

  • JAVA;
  • Python;
  • Golang:
  • Springboot;
  • Django;
  • Dubbo;
  • Nacos;
  • ZK;
  • Sentinel;
  • Redis;

JAVA+springboot+Dubbo+Nacos:

  • 用户账户服务;
  • 商品服务;
  • 优惠服务;
  • 库存服务;
  • 订单服务; 
  • 评论服务;
  • 清结算服务;
  • 发票服务;

用Django+channels实现的:客服服务    Websocket;

Golang:秒杀服务,用golang+Redis单独写了秒杀服务,参考小米的大秒系统;

MysqlProxy:实现读写分离+ 分库分表

Nacos+sentinel:nacos实现注册中心,服务发现,限流熔断配置发现、sentinel熔断限流。

ZK:订单号,分布式唯一ID生成

ES:商品存储,用于搜索查询。

Shardingshpere:订单分库分表,这个也纯粹是练习。

三、总结

        我开发的电商系统并不是完整的,像支付、物流、退款等都没有写,不过当时在开发的过程中,的确又学到了很多。网上也有很多开源的系统,尤其是听说那些报培训班的都有电商系统开发。虽然本人对培训班嗤之以鼻,不屑于多看他们一眼,但所谓存在的就是合理的,他们弄电商系统也侧面说明这玩意是有实战意义的,实战一段时间后还是有提高的。

        代码就不展示了,如果有对这方面感兴趣的同学可以网上找找更好的开源示例,不过我的代码可以免费私下给。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch7.8的下载与安装和Kibana 7.8.0工具使用安装

1、ElasticSearch7.8.0下载 elasticsearch: 官方下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 链接: https://pan.baidu.com/s/1wAKQoB3nhLhcnBlPfVOLxQ 提取码: t83n kibana: 链接: https://pan.baidu.com/s/156aD9zDdvUv8LFgDEIPoSw 提取码:…

云存储中常用的相同子策略的高效、安全的基于属性的访问控制的论文阅读

参考文献为2022年发表的Efficient and Secure Attribute-Based Access Control With Identical Sub-Policies Frequently Used in Cloud Storage 动机 ABE是实现在云存储中一种很好的访问控制手段&#xff0c;但是其本身的计算开销导致在实际场景中应用收到限制。本论文研究了…

(2024)Ubuntu源码安装多个版本的opencv并切换使用

本人工作会用到x86_64的opencv和aarch64的opencv&#xff0c;所以写下来备忘自用 一、源码编译安装 依赖库安装&#xff1a; sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev o…

上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 做过isp的同学都知道&#xff0c;图像处理里面有一个3A&#xff0c;即自动曝光、自动白平衡和自动对焦。其中自动对焦这个&#xff0c;就需要用输入…

HarmonyOS NEXT应用开发之PersistentStorage:持久化存储UI状态

前两个小节介绍的LocalStorage和AppStorage都是运行时的内存&#xff0c;但是在应用退出再次启动后&#xff0c;依然能保存选定的结果&#xff0c;是应用开发中十分常见的现象&#xff0c;这就需要用到PersistentStorage。 PersistentStorage是应用程序中的可选单例对象。此对…

Vue的学习之旅-part1

Vue的学习之旅-part1 vue介绍vue读音编程范式ES6中不用var声明变量vue的声明、初始化传参使用data中数据时要用this指向 vue中的语法糖MVVM在Vue中&#xff0c; MVVM的各层的对应位置 方法、函数的不同之处 vue介绍 vue读音 Vue 读作 /vju:/ 不要读成v u e Vuex 的x读作叉 不…

Redis高可用技术

一.Redis高可用介绍&#xff1a; 高可用是指&#xff1a;服务器正常访问的时间 衡量的标准是&#xff1a;在多长时间内可以提供正常服务99.9%、99.99%、99.999%等等 但是在Redis语境中&#xff0c; 高可用的含义似乎要宽泛一些&#xff0c;除了保证提供正常服务(如主从分离、…

IntelliJ IDEA中文---强化智能编码与重构,提升开发效率

IntelliJ IDEA 2023是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它支持智能代码编辑、自动补全和重构&#xff0c;帮助开发者提高编码效率。同时&#xff0c;内置了丰富的调试工具&#xff0c;支持断点调试和变量监视&#xff…

C语言--文件操作

1.标准流 • stdin - 标准输⼊流&#xff0c;在⼤多数的环境中从键盘输⼊&#xff0c;scanf函数就是从标准输⼊流中读取数据。 • stdout - 标准输出流&#xff0c;⼤多数的环境中输出⾄显⽰器界⾯&#xff0c;printf函数就是将信息输出到标准输出 流中。 • stderr - 标…

丰诺畅机电科技将莅临2024年第13届生物发酵展

参展企业介绍 无锡丰诺畅机电科技有限公司&#xff0c;是一家分离设备专业制造公司&#xff0c;集开发、设计、制造、销售、服务于一体;具有专业的生产技术&#xff0c;先进的生产工艺&#xff0c;精良的制造设备&#xff0c;完善的检测手段;为满足不同用户的过滤需求&#xf…

HTTP/UDP/TCP/IP网络协议

文章目录 计算机网络基础HTTPUDPTCP连接管理(三次握手/四次挥手)TCP可靠传输(确认答应)超时重传滑动窗口流量控制拥塞控制延时应答捎带应答粘包问题其他 IP数据链路层MUT 相关问题TCP会粘包、UDP永远不会粘包 学习博客 计算机网络基础 OSI模型定义了网络互连的七层框架&#x…

esp32控制舵机---待完善

舵机有三个引脚&#xff0c;分别是电源、电源GND和信号线。如下图所示&#xff1a; ESP32-WROOM-32E的引脚的定义如下&#xff1a; 图来自乐鑫官网:ESP32-DevKitC V4 入门指南 - ESP32 - — ESP-IDF 编程指南 v5.2.1 文档 硬件连接图&#xff1a; 待补充

013——超声波模块驱动开发(基于I.MX6uLL与SR04)

目录 一、 模块介绍 1.1 产品特色 1.2 产品实物图 1.3 接口定义 1.4 测距调节 1.5 模块工作原理 1.6 注意 二、 编码思路 三、 驱动程序 四、 应用程序 五、 Makefile 六、 其它及实验 一、 模块介绍 超声波测距模块是利用超声波来测距。模块先发送超声波&#xf…

边缘计算盒子与云计算:谁更适合您的业务需求?

边缘计算盒子和云计算&#xff0c;这两个概念听起来可能有点复杂&#xff0c;但其实它们就是两种不同的数据处理方式。那谁更适合您的业务需求呢&#xff1f;咱们来详细说说。 边缘计算盒子&#xff0c;就像是个小型的数据处理中心&#xff0c;放在离你业务现场比较近的地方。它…

WPS二次开发专题:如何获取应用签名SHA256值

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在申请WPS SDK授权版时候需要开发者提供应用包名和签…

美创科技获浙江省网络空间安全协会多项荣誉认可

4月2日&#xff0c;浙江省网络空间安全协会第二届会员大会第一次会议在杭州隆重召开&#xff0c;近180家会员单位代表、数十位特邀专家、嘉宾莅临现场。浙江省委网信办副主任马晓军出席会议并致辞&#xff0c;本次大会由协会秘书长吴铤主持。 凝心聚力&#xff0c;继往开来&…

SAP:无法在插件模式 HTTP 中处理消息 E ** xxx

问题描述&#xff1a;利用post方式接口&#xff0c;返回信息为 无法在插件模式 HTTP 中处理消息 E ** xxx ,如何排查是因为什么问题导致的&#xff1f; 解决方法&#xff1a; 事务码&#xff1a;SE91, 输入消息类&#xff0c;消息编号&#xff0c;点击显示&#xff0c;查看报…

【NLP笔记】LLM应用之AI Agent LangChain实战

文章目录 AI Agent概述LangChain实战构建prompt模版LLM调用调用HuggingFace开源大模型&#xff08;在线&#xff09;调用HuggingFace开源大模型&#xff08;本地&#xff09;调用文心一言 ChainsSingle ChainSequential ChainSimple Sequential ChainComplex Sequential Chain …

【重学C语言】三、C语言最简单的程序

【重学C语言】三、C语言最简单的程序 最简单的程序头文件使用尖括号 < >使用双引号 ""区别与注意事项示例 主函数认识三个错误 常量和变量常量ASCII 码表转义字符 关键字数据类型关键字存储类关键字修饰符关键字控制流程关键字函数相关关键字其他关键字 变量变…

长连接详解

一分钟了解长连接 、短连接、心跳机制与断线重连 - 知乎 (zhihu.com) websocket 实现长连接原理_websocket 是长连接吗-CSDN博客