【《基于SpringBoot的分布式微服务商城系统设计》14000字(论文)】_第1页
【《基于SpringBoot的分布式微服务商城系统设计》14000字(论文)】_第2页
【《基于SpringBoot的分布式微服务商城系统设计》14000字(论文)】_第3页
【《基于SpringBoot的分布式微服务商城系统设计》14000字(论文)】_第4页
【《基于SpringBoot的分布式微服务商城系统设计》14000字(论文)】_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于SpringBoot的分布式微服务商城系统设计摘要:伴随的时代的不断发展,本世纪网络购物已经成为如今中国最大的市场,覆盖人群面广泛,而本购物商城系统主要针对人群为有一定购买力的小康水平人群。本购物商城系统主要采用微服务架构,采用前端与后端分离的模式,数据发展之间信息交互利用token进行。系统主要有这些模块:1、商品的销售服务。2、用户的会员服务。3、仓储的库存服务。4、购物车的服务。5、订单的相关服务。6、搜索商品的服务。后端使用Springboot+Springcloud+mybatis的架构,开发语言使用的是Java,前端使用vue.js框架,轻量级开源MySQL关系数据库用于存储数据,jdk为1.8。实现了后台对商品、品牌、订单、库存和用户的管理等,可以对商品信息进行分析搜索、加入购物车、支付、查看历史订单管理等功能。关键词:基于SpringBoot的分布式微服务商城系统;Java;Mysql;vue.js目录1绪论 51.1项目背景 51.2研究的内容和主要工作 51.2.1研究的内容 51.2.2本人主要工作 61.3论文结构 62需求分析 72.1业务分析 72.1.1业务描述 72.1.2业务人员分析 72.2系统业务流程分析 72.2.1用户登录流程 72.2.2用户购物流程 92.3系统用例分析 112.3.1用户角色分析 112.3.2用例分析 113软件设计 273.1软件体系结构设计 273.2软件功能模块设计 283.2.1系统总体功能设计 283.2.2登录注册功能模块设计 293.2.3搜索商品功能模块设计 303.2.4购物车功能模块设计 303.2.5订单中心功能模块设计 313.2.6商品管理功能模块设计 323.2.7库存管理功能模块设计 333.3数据库设计 343.3.1实体类关系分析 343.3.2数据库表 344系统实现 404.1注册登录功能实现 404.2搜索商品功能实现 464.3购物车功能实现 494.4订单功能实现 524.5商品管理功能实现 534.6库存管理功能实现 545总结与展望 555.1总结 555.2进一步的工作 55参考文献 561绪论1.1项目背景伴随着互联网上电子商务的持续蓬勃发展,现如今网络购物已经成为了现在如今中国最大的市场,2021年中国网络进行购物市场环境分析研究报告表明:随着我国消费服务的升级和互联网的迅速普及,网络购物市场有着良好的发展趋势。这些年来,中国进行网上购物客户信息数量、在我国的渗透率、总交易成本金额均稳定发展持续的增长,一同驱动着我国的网络平台购物服务市场的成长。据相关数据显示,2019年中国网购客户数量达到6.49亿,在中国的渗透率为76.2%,交易总额达到6.66万亿元。估计到2020年网上购物客户总数量将达6.59亿人,总买卖金额将达6.82万亿元,在我国渗透率将达到79.5%。所以这是一个巨大的市场,也是未来的主流方向。在2020年的疫情中,线下实体经营店铺受到了非常巨大的冲击,街道空荡荡的,原本熙熙攘攘的商场变得很冷清,营商环境也不容乐观。而线上购物已经成为了带动我国的经济发展的最为核心的增长极,引领中国经济不断向前。成为将来社会经济不断发展的重要支柱,所以我认为不管是现在还是未来,网络购物都将是大有可为的。网购种类丰富全面,省时省力。如今各种网购平台混杂,网上购物商品的质量也参次不齐,软件公司各种获取身份信息的行为让个人隐私安全权益难以得到应有的保障,而一个好的网上购物商城不仅能给消费者提供更好的消费体验,还能有效的保障消费的权益,需要严格对商品质量的把关和对服务的全面升级。1.2研究的内容和主要工作1.2.1研究的内容先详细分析和描述系统设计的业务流程、目标及功能。然后研究与设计系统的数据库、模块以及具有的功能。本系统主要设计了登录注册模块、用户服务模块、商品服务模块、购物车模块、订单服务模块、检索服务模块、库存服务模块、网关服务模块以及第三方服务模块。管理员可以管理菜单分类、商品属性分组、商品规格参数、商品销售属性、商品的增删改查、商品库存的增删改查、以及商品的上架。用户可以搜索商品、查看商品、加入购物车、提交订单、支付和查看订单。前后端主要使用的技术栈如下表:前端技术栈表STYLEREF1\s0SEQ表\*ARABIC\s11前端技术栈技术版本类型Vue2.5.16渐进式框架Element2.8.2UI组件npm6.9.0包管理器后端技术栈表STYLEREF1\s0SEQ表\*ARABIC\s12后端技术栈技术版本类型SpringBoot2.1.8.RELEASE项目框架Maven3.6.1项目构建系统MySQL5.7关系型数据库Redis2.1.8.RELEASE缓存数据库Docker19.03.12应用容器引擎Nacos1.1.4服务注册发现中心Nginx1.14HTTP和反向代理web服务器mybatis-plus3.2.0持久层框架openfen2.1.3.RELEASE远程调用ElasticSearch7.6.2分布式搜索分析引擎oauth2.02.0开放授权标准Kibana7.6.2数据分析RabbitMQ3.8.9消息中间件Lombok1.18.8简化消除冗余代码工具thymeleaf2.1.8.RELEASEHTML5模板引擎1.2.2本人主要工作本人主要负责微服务购物商城系统业务分析中登录注册服务流程分析、逻辑模型、静态页面设计、UML类图以及流程图的构建,数据库设计,业务流程分析,完成各个功能模块的具体实现,页面美化,后期系统测试和维护。1.3论文结构本文中各个章节内容:第一章介绍了购物商城系统的项目背景,本系统研究的主要内容以及本人的主要工作。第二章对业务进行详细的研究与需求分析,包括:业务描述、业务流程分析和和系统用例分析。第三章对系统进行设计,包括:体系架构设计、功能模块设计、实体类分析、数据库表设计。第四章对系统各个模块功能的实现及前后端界面、部分代码的展示。第六章总结了本文中所完成的工作,并且对个人的进一步的工作进行展望。2需求分析2.1业务分析2.1.1业务描述现在中国市场上比较常见的商城管理模式有六种:B2B、B2C、

C2B、C2C、O2O和O2P。1、B2BMode。B2B(BusinesstoBusiness),是指商家对商家。2、B2CMode。B2C(BusinesstoConsumer),它是直接向消费者销售产品和服务。也就是我们可以通过经常看到的供应商家直接的把产品给到用户手中的方式,也就是中国商业零售发展方式。3、C2BMode。C2B(CustomertoBusiness),先先有消费客户群体提出相关产品发展需求,后有负责公司生产的企业按需求组织生产技术产品。即从消费客户到生产的企业的模式。它是在企业生产之前,以消费者需求为前提生产的。4、C2CMode。C2C(CustomertoConsumer),交易模式是在消费用户与消费用户之间发生的。5、O2OMode。O2O(OnlineToOfline),线上市场和线下市场的有机结合。线上快速支付,线下优质服务。6、O2PMode。(也就是OnlineToPlace),它的营销模式是一种本土化的02O行为。而我们的系统采用的是B2C的自营商品模式,可以更直接、高效的把控商品的质量,以及更好的服务客户。2.1.2业务人员分析(1)用户:可以注册登录、可以检索商品、查看商品详情、加入购物车、可以修改购物车中商品数量、可以删除购物车中商品、提交选中商品订单、付款之后可以查看订单的详情。(2)管理员:在后台可以对商品的信息修改、删除,商品库存的修改,上架商品到商城中。2.2系统业务流程分析2.2.1用户登录流程如下图2-1所示,购物商城系统登录注册工作流程说明:用户在登录界面开始登录,如果是新用户,前往注册界面,注册成功返回登录页面。使用普通登录和第三方登录则在后台进行验证,验证成功进入后台首页。图2SEQ图\*ARABIC\s21登录注册流程图2.2.2用户购物流程如下图2-2所示,购物商城系统购物工作流程说明:用户在商城首页可以选择搜索自己想买的商品,也可以通过菜单栏的商品分类查看商品列表。用户在商品列表中点击要购买的商品可以在商品详情页中查看。用户在商品详情页中可以选择想要销售属性,点击加入购物车。用户可以在购物车中对商品进行增加,减少以及删除。用户在点击选中要购买的商品,然后提交订单。订单验证完成后,支付确认也点击确定。跳转到支付宝的沙箱支付页面支付成功之后,重定向回订单页面。同时修改订单表中订单状态。图2SEQ图\*ARABIC\s22购物流程图2.3系统用例分析2.3.1用户角色分析从雁来购物商城系统的所需要的功能需求分析,系统主要涉及到以下角色:表2-3用户角色划分表角色职责或功能用户系统主要参与者,可以注册登录、可以检索商品、查看商品详情、加入购物车、可以修改购物车中商品数量、可以删除购物车中商品、提交选中商品订单、付款之后可以查看订单的详情。管理人员系统的管理人员,负责上传考勤信息、考勤备份等2.3.2用例分析下面给出了商城系统的总体用例图,包含登录注册、搜索商品、购物车、订单、商品系统、库存系统六个模块,如下图所示:图2SEQ图\*ARABIC\s23系统总体用例图注册登录用例图2SEQ图\*ARABIC\s24用户登录注册用例图如上图所示,用户对注册登录的用例。用户在商城登录页面可以进行普通登录以及微博登录,新用户可以进行用户注册。表2-4用户注册用例描述描述项说明名称用户注册描述描述了用户使用本系统注册登录模块进行用户注册的过程参与者用户前置条件必须是新用户后置条件生成用户信息到用户表基本操作流在系统中点击“免费注册”;进入系统注册界面;输入新用户的账号、密码、手机号;点击“发送验证码”按钮;输入验证码;点击“立即注册”按钮。表2-5普通登录用例描述描述项说明名称普通登录描述描述了用户使用本系统注册登录模块进行普通登录的过程参与者用户前置条件用户已在用户表中存在后置条件登录成功进入商城首页基本操作流在系统中点击“你好,请登录”按钮;进入系统登录页面,输入用户名、密码;点击登录按钮;表2-6微博登录用例描述描述项说明名称微博登录描述描述了用户使用本系统注册登录模块进行微博登录的过程参与者用户前置条件后置条件登录成功进入商城首页基本操作流在系统中点击“你好,请登录”按钮;进入系统登录页面,点击“微博”按钮图标;跳转出扫码登录界面,用微博扫描登录;搜索商品用例图2SEQ图\*ARABIC\s25用户搜索商品用例图如上图所示,用户对搜索商品的用例。用户在商城首页可以进行搜索商品,在商品列表中选择商品查看商品的详情,然后现在商品参数加入到购物车当中。表2-7搜索商品用例描述描述项说明名称搜索商品描述描述了用户使用本系统搜索模块进行查找商品的过程参与者用户前置条件商品已经上架后置条件到达商品列表页面基本操作流在商城首页中点击商品的分类菜单或者在搜索框中搜索商品;表2-8商品详情用例描述描述项说明名称商品详情描述描述了用户使用本系统搜索模块选择商品进行查看商品详情的过程参与者用户前置条件商品已经上架后置条件到达商品详情页基本操作流在商品列表页中点击要购买的商品;表2-9选择商品参数用例描述描述项说明名称选择商品参数描述描述了用户使用本系统在商品详情页中选择要购买商品销售参数的过程参与者用户前置条件商品已经上架后置条件选中该商品的sku基本操作流在商品详情页中选择销售属性;表2-10加入购物车用例描述描述项说明名称加入购物车描述描述了用户使用本系统在商品详情页选择要购买商品销售参数的之后加入到购物车中过程参与者用户前置条件商品已经上架,已选中该商品的sku后置条件商品信息在购物车列表中基本操作流点击商品详情页中的“加入购物车”按钮;购物车用例图2SEQ图\*ARABIC\s26用户购物车用例图如上图所示,用户对购物车的用例。用户在商城购物车页面可以对购物车之中的商品进行数量的加减,还可以删除想删除的商品,也可以选择其中的部分商品进行结算,然后支付。表2-11购物车商品数量修改用例描述描述项说明名称购物车商品数量修改描述描述了用户使用本系统购物车模块页面中修改购物车商品数量的过程参与者用户前置条件商品已经加入到购物车之中后置条件购物车中商品数量修改基本操作流在商城首页中点击“我的购物车”按钮;进入到购物车界面,点击“+”按钮,购物车商品数量增加。点击“-”按钮,购物车商品数量增加。表2-12购物车商品删除用例描述描述项说明名称购物车商品删除描述描述了用户使用本系统购物车模块删除购物车商品的过程参与者用户前置条件商品已经加入到购物车之中后置条件该商品从购物车页面中删除基本操作流在购物车页面中点击“删除”按钮,在弹框中再次点击“删除”;表2-13选中购物车商品结算用例描述描述项说明名称选中购物车商品结算描述描述了用户使用本系统购物车模块选中购物车商品提交订单的过程参与者用户前置条件商品已经加入到购物车之中,用户已登录后置条件商品加入到订单页面基本操作流在购物车中选择要结算的商品点击“去结算”按钮;在订单确认页中点击“提交订单”;表2-14支付用例描述描述项说明名称支付描述描述了用户使用本系统订单中支付的过程参与者用户前置条件商品已经生成订单后置条件订单中商品的状态改变基本操作流在支付页中点击“支付宝”支付按钮;跳转到支付宝沙箱支付页面,登录支付宝账号;输入支付宝支付密码;查看订单用例图2SEQ图\*ARABIC\s27用户查看订单用例图如上图所示,用户对查看订单的用例。用户在商城我的订单页面可以查看当前登录账号的所有已生成的订单详情。表2-15查看订单用例描述描述项说明名称查看订单描述描述了用户使用本系统查看已购买商品的过程参与者用户前置条件商品已购买、用户已登录后置条件加载已购买商品列表信息基本操作流在商城首页点击“我的顶单”按钮商品管理用例图2SEQ图\*ARABIC\s28管理员管理商品用例图如上图所示,管理员对商品管理的用例。用户在商城后台商品管理页面可以对分类菜单进行维护、商品品牌的维护、商品属性分组的维护、商品规格参数的维护、商品销售属性的维护、商品的维护以及商品的上架操作。表2-16分类菜单增删改查用例描述描述项说明名称分类菜单增删改查描述描述了管理员使用后台管理系统对分类菜单增删改查的过程参与者管理员前置条件管理员已登录后置条件商城页面中分类菜单改变基本操作流点击“分类维护”按钮,点击“append”,可以对菜单增加。点击“edit”可以对菜单删除。表2-17商品品牌的增删改查用例描述描述项说明名称商品品牌的增删改查描述描述了管理员使用后台管理系统对商品品牌种类增删改查的过程参与者管理员前置条件管理员已登录后置条件商城页面中品牌种类改变基本操作流点击“品牌管理”按钮,点击“新增”按钮;输入品牌名、品牌logo、介绍、检索字母等,点击“确定”按钮,品牌种类增加;点击“删除”按钮,品牌种类减少。表2-18商品属性分组的增删改查用例描述描述项说明名称商品属性分组的增删改查描述描述了管理员使用后台管理系统对商品属性分组增删改查的过程参与者管理员前置条件管理员已登录后置条件商城页面中属性分组改变基本操作流点击“属性分组”按钮,点击“新增”按钮;输入组名、排序、所属分类,点击“确定”按钮,属性分组增加;点击“删除”按钮,属性分组减少。表2-19商品规格参数的增删改查用例描述描述项说明名称商品规格参数的增删改查描述描述了管理员使用后台管理系统对商品规格参数增删改查的过程参与者管理员前置条件管理员已登录后置条件商城页面中规格参数改变基本操作流点击“规格参数”按钮,点击“新增”按钮;输入属性名、可选值、所属分类、所属分组,点击“确定”按钮,规格参数增加;点击“删除”按钮,规格参数减少。表2-20商品销售属性的增删改查用例描述描述项说明名称商品销售属性的增删改查描述描述了管理员使用后台管理系统对商品销售属性增删改查的过程参与者管理员前置条件管理员已登录后置条件商城页面中销售参数改变基本操作流(1)点击“销售参数”按钮,点击“新增”按钮;输入属性名、可选值、所属分类、所属分组,点击“确定”按钮,销售参数增加;点击“删除”按钮,销售参数减少。表2-21新增商品用例描述描述项说明名称新增商品描述描述了管理员使用后台管理系统对商品增加的过程参与者管理员前置条件管理员已登录后置条件商品表中新增商品基本操作流点击“发布商品”按钮,输入商品名、商品描述、选择分类、商品重量、商品介绍图片、商品图片,点击“设置基本参数”按钮;设置好规格参数之后,点击“设置销售属性”按钮;设置好规格参数之后,点击“设置SKU信息”按钮;然后点击“保存商品信息”按钮,商品新增完成;表2-22商品的删除用例描述描述项说明名称商品的删除描述描述了管理员使用后台管理系统对商品维护的过程参与者管理员前置条件管理员已登录后置条件商品表中商品改变基本操作流点击“商品管理”按钮,点击“删除”按钮,商品减少。表2-23商品上架用例描述描述项说明名称商品上架描述描述了管理员使用后台管理系统对商品进行上架到商城的过程参与者管理员前置条件管理员已登录、商品已新增后置条件商城页面中有该商品基本操作流点击“spu管理”按钮,点击“上架”按钮;库存管理用例图2SEQ图\*ARABIC\s29管理员库存管理用例图如上图所示,管理员对库存管理的用例。用户在商城后台库存管理页面可以对仓库进行维护、以及对sku的库存进行增加、修改、删除等操作。表2-24仓库增加用例描述描述项说明名称仓库增加描述描述了管理员使用后台管理系统对仓库进行增加的过程参与者管理员前置条件管理员已登录后置条件商品可在该仓库存储基本操作流在后台管理系统中点击“仓库维护”按钮,点击“新增”按钮;输入仓库名、仓库地址、区域编码,点击确定;表2-25仓库修改用例描述描述项说明名称仓库增加描述描述了管理员使用后台管理系统对仓库进行修改的过程参与者管理员前置条件管理员已登录后置条件仓库信息改变基本操作流在后台管理系统中点击“仓库维护”按钮,点击“修改”按钮;修改仓库名、仓库地址、区域编码,点击确定;表2-26仓库删除用例描述描述项说明名称仓库删除描述描述了管理员使用后台管理系统对仓库进行删除的过程参与者管理员前置条件管理员已登录后置条件仓库从界面中移除基本操作流在后台管理系统中点击“仓库维护”按钮,点击“删除”按钮;表2-27sku库存增加用例描述描述项说明名称sku库存增加描述描述了管理员使用后台管理系统对sku库存进行增加的过程参与者管理员前置条件管理员已登录、商品已新增后置条件商品库存增加基本操作流在后台管理系统中点击“商品库存”按钮,点击“新增”按钮;输入sku_id、选择仓库、库存数、sku_name,点击确定;表2-28sku库存修改用例描述描述项说明名称sku库存修改描述描述了管理员使用后台管理系统对sku库存进行修改的过程参与者管理员前置条件管理员已登录、商品已新增后置条件商品库存信息改变基本操作流在后台管理系统中点击“商品库存”按钮,点击“修改”按钮;输入sku_id、选择仓库、库存数、sku_name,点击确定;表2-29sku库存删除用例描述描述项说明名称sku库存删除描述描述了管理员使用后台管理系统对sku库存进行删除的过程参与者管理员前置条件管理员已登录、商品已新增后置条件商品无库存基本操作流在后台管理系统中点击“商品库存”按钮,点击“删除”按钮;3软件设计3.1软件体系结构设计系统采用当前主流技术,前端技术栈有Node.js、vue、Element-ui、ES6等技术,后端技术栈有SpringBoot、SpringCloudAlibaba、Lombok、Mybatis-plus、MySql、Redis、Ngnix、Maven等技术。以上都是目前主流的技术框架,非常成熟稳定。采用前端Visual

Studio代码开发工具,开源、免费并与许多插件集成是Visual

Studio

Code的优势,可以协助我们更快的开发。后端系统开发研究工具可以使用IntelliJ

IDEA,IntelliJ

IDEA是目前主流的Java开发集成环境,比Eclipse更加智能,人性化。同时十分强大。数据库使用MySQL,免费,支持高并发,语法简单,操作方便。系统开发按照Java开发规范要求,提高企业代码的可靠性、可读性、可维护性和可修改性。系统大概的技术层如下图:图31系统架构图前端Vue.js框架一种用于构建客户界面的渐进式的JavaScript框架是Vue.js.其优点是体积更小、运行效率更高、双向数据绑定、生态丰富、学习成本低。成熟稳定,开发成本低。系统主要采用Vue脚手架实现后台管理系统的模块化开发。可以单独于Model的变化和更改是vue.js的一大特点。而且能够在多个view重用一个ViewModel的视图逻辑,可重用性强。同时Vue的数据与视图同步可以使我们专注于业务层面上有关data以及逻辑的工作。后端SpringBoot框架可以以jar的方式进行单独的运行SpringBoot,不用进行单独去下载Tomcat之类的服务器装载springboot项目,内嵌到容器设计中去,使得学生我们可以让项目管理更加经济快速的运行,也降低企业项目对运行工作环境的基本发展要求,环境中配置好jdk就可以了。SpringBoot比Spring提供了更多的注解,大量使用了自动化配置,简单了开发的进程。数据库MySql轻量级应用开源的MySQL关系型数据库是开源可以免费的数据库,任何用户都可以在轻量级开源的MySQL的官网上把它下载下来,是不需要付费使用的。轻量级开源MySQL不仅可以在windows系列桌面操作系统上运行,还可以在UNIX、Linux、macos等桌面操作系统上运行。所以有大量的网络站点开发都选择Linux和UNIX作为站点的服务器,它在Web应用方面的优势在于轻量级开源的MySQL的跨平台性。轻量级开源的MySQL关系型数据库管理服务器是有多用户、多线程SQL的。能够快速、有效、安全地处理大量数据。快速、健壮和易用。3.2软件功能模块设计3.2.1系统总体功能设计图32系统总体功能设计图如上图3-2所示,雁来购物商城系统一共分为两大模块:前端商城界面和后端管理界面。在系统的前端要实现用户注册,用户注册之后可以进行普通登录,还可以用微博扫描登录。登录之后搜索商品、查看商品列表、查看商品详情、选择要购买的商品的属性、可以将商品加入到购物车当中、可以对购物车中的商品进行各种操作,可以选择商品进行下单付款,可以查看下单的商品。在系统后台要实现管理员对商品的发布、更新、删除,商城菜单栏的更新、删除,商品库存的更新、删除,商品仓库的更新、删除等操作。3.2.2登录注册功能模块设计图33用户登录注册模块缩略类图图34注册时序图如上图登录注册功能模块缩略类图以及注册时序图中,用户在商城的登录注册界面,可以实现登录和注册,而登录注册需要创建用户实体类,来验证用户登录以及存储用户的相关信息。用户实体类中有用户的id、等级、账户名、密码、手机号、头像、状态、创建时间、唯一id、访问令牌值、访问令牌的时间。3.2.3搜索商品功能模块设计图35用户搜索商品模块缩略类图如上图用户搜索商品模块缩略类图中,用户在商城的首页中,可以搜索商品、查看商品列表、选择商品查看商品详情,这需要创建spu实体类,spu实体类中包括spu的id、spu的名字、spu的介绍、所属的菜单分类、所属的品牌分类、重量、是否上架状态值、创建时间以及更新时间,以实现可以对商品进行以上操作,而对商品的属性的选择,则需要创建sku实体类,以确实我们唯一要购买的商品。Sku实体类中包括sku的id、spu的id、sku的名字、sku的介绍、所属的菜单分类、所属的品牌分类、默认的图片、sku的标题以及价格。3.2.4购物车功能模块设计图36用户购物车模块缩略类图如上图用户购物车模块缩略类图中,用户要在购物车中实现购物车商品数量的增减、删除、以及选中商品进行结算操作,需要创建购物车信息的实体类,其中包括购物车中所有的商品信息、数量、商品类型数量、商品总价、商品的减免价格。3.2.5订单中心功能模块设计图37用户订单模块缩略类图如上图用户订单模块缩略类图中,用户要在订单页面中查看当前账号生成的订单,需要创建订单实体类,其中包括订单的id、用户的id、订单的订单号、订单的创建时间、用户的用户名、订单总价、订单实际付款、订单状态、收货人的姓名、收货人的手机号、收货人的邮编、收货人所在的省、收货人所在的市、收货人所在的区、收货人的详细地址、支付时间。3.2.6商品管理功能模块设计图38管理员商品管理模块缩略类图如上图管理员商品管理模块缩略类图中,管理员要在后台界面商品管理中实现对分类菜单信息的维护,需要创建商品分类实体类来实现,商品分类实体类包括了分类的id、分类的名称、父分类的id、层级、以及计量的单位。管理员要在后台界面商品管理中实现对品牌信息的维护,需要创建品牌实体类来实现,品牌实体类包括了品牌的id、品牌的名称、品牌的logo、介绍、以及检索首字母。管理员要在后台界面商品管理中实现对规格参数和销售属性的维护,需要创建属性分组实体类来实现,属性分组实体类包括了属性分组的id、属性分组的名称、属性分组所属的菜单id。管理员要在后台界面商品管理中实现对商品的发布、上架以及维护,需要创建spu实体类来实现,spu实体类中包括spu的id、spu的名字、spu的介绍、所属的菜单分类、所属的品牌分类、重量、是否上架状态值、创建时间以及更新时间。3.2.7库存管理功能模块设计图39管理员库存管理模块缩略类图如上图库存管理功能模块缩略类图中,管理员进入后台系统的仓库维护界面,可以对仓库的进行增加、修改、删除,而仓库的维护需要创建仓库信息类,仓库信息类中需要包含仓库的id、名字、地址和区域编码。还可以通过商品库存管理来对哪些仓库存有多少商品库存进行设定。这需要创建商品库存信息类需要包含商品库存id、sku_id、库存、sku名字等。3.3数据库设计3.3.1实体类关系分析图3SEQ图\*ARABIC\s210系统数据表E-R图如上图3-10雁来购物商城系统中,用户和用户地址、sku、spu是一对多的关系,一个用户可以拥有多个收货的地址,一个用户也可以查看多个spu商品,可以购买多个sku商品。而一个spu里面也拥有多个sku以及多个spu属性、spu图片。一个品牌拥有多个属性的分组和多个spu,一个属性分组拥有多个商品属性,一个sku可以生成多个商品订单和多个商品库存、拥有多个sku属性和多个sku图片。而一个商品的库存可以有多个不同的仓库。3.3.2数据库表1、商品属性表保存商品属性信息表31商品属性表字段名字段类型长度允许空是否主键描述attr_idbigintnullNO是属性idattr_namechar30YES属性名value_selectchar255YES可选值列表[用逗号分隔]attr_typetinyintnullYES属性类型enablebigintnullYES启用状态[0-禁用,1-启用]catelog_idbigintnullYES所属分类2、属性分组表保存属性分组信息表32属性分组表字段名字段类型长度允许空是否主键描述attr_group_idbigintnullNO是分组idattr_group_namechar20YES组名descriptvarchar255YES描述catelog_idbigintnullYES所属分类id3、商品品牌表保存商品品牌信息表3SEQ表\*ARABIC\s13商品品牌表字段名字段类型长度允许空是否主键描述brand_idbigintnullNO是品牌idnamechar50YES品牌名logovarchar2000YES品牌logo地址descriptlongtext4294967295YES介绍first_letterchar1YES检索首字母4、商品分类表保存商品菜单信息表3SEQ表\*ARABIC\s14商品分类表字段名字段类型长度允许空是否主键描述cat_idbigintnullNO是分类idnamechar50YES分类名称parent_cidbigintnullYESMUL父分类idcat_levelintnullYES层级product_countintnullYES商品数量5、spu属性表保存spu属性信息表3SEQ表\*ARABIC\s15spu属性表字段名字段类型长度允许空是否主键描述idbigintnullNO是idspu_idbigintnullYES商品idattr_idbigintnullYES属性idattr_namevarchar200YES属性名attr_valuevarchar200YES属性值6、sku图片表保存sku图片信息表3SEQ表\*ARABIC\s16sku图片表字段名字段类型长度允许空是否主键描述idbigintnullNO是idsku_idbigintnullYESsku_idimg_urlvarchar255YES图片地址default_imgintnullYES默认图[0-不是默认图,1-是默认图]7、sku信息表保存sku信息表3SEQ表\*ARABIC\s17sku信息表字段名字段类型长度允许空是否主键描述sku_idbigintnullNO是skuIdspu_idbigintnullYESspuIdsku_namevarchar255YESsku名称sku_descvarchar2000YESsku介绍描述catalog_idbigintnullYES所属分类idbrand_idbigintnullYES品牌idsku_default_imgvarchar255YES默认图片sku_titlevarchar255YES标题pricedecimalnullYES价格8、sku销售属性表表3SEQ表\*ARABIC\s18sku销售属性表字段名字段类型长度允许空是否主键描述idbigintnullNO是idsku_idbigintnullYESsku_idattr_idbigintnullYESattr_idattr_namevarchar200YES销售属性名attr_valuevarchar200YES销售属性值9、spu图片表表3SEQ表\*ARABIC\s19spu图片表字段名字段类型长度允许空是否主键描述idbigintnullNO是idspu_idbigintnullYESspu_idimg_namevarchar200YES图片名img_urlvarchar255YES图片地址default_imgtinyintnullYES是否默认图10、spu信息表表3SEQ表\*ARABIC\s110spu信息表字段名字段类型长度允许空是否主键描述idbigintnullNO是商品idspu_namevarchar200YES商品名称spu_descriptionvarchar1000YES商品描述catalog_idbigintnullYES所属分类idbrand_idbigintnullYES品牌idweightdecimalnullYESpublish_statustinyintnullYES上架状态[0-下架,1-上架]create_timedatetimenullYESupdate_timedatetimenullYES11、收货地址表表3SEQ表\*ARABIC\s111收货地址表字段名字段类型长度允许空是否主键描述idbigintnullNO是idmember_idbigintnullYESmember_idnamevarchar255YES收货人姓名phonevarchar64YES电话post_codevarchar64YES邮政编码provincevarchar100YES省份/直辖市cityvarchar100YES城市regionvarchar100YES区detail_addressvarchar255YES详细地址(街道)areacodevarchar15YES省市区代码default_statustinyintnullYES是否默认12、用户表表3SEQ表\*ARABIC\s112用户表字段名字段类型长度允许空是否主键描述idbigintnullNO是idlevel_idbigintnullYES会员等级idusernamechar64YES用户名passwordvarchar64YES密码mobilevarchar20YES手机号码headervarchar500YES头像statustinyintnullYES启用状态create_timedatetimenullYES注册时间social_uidvarchar225YES社交用户的唯一idaccess_tokenvarchar255YES访问令牌expires_invarchar255YES访问令牌的时间13、订单表表3SEQ表\*ARABIC\s113订单表字段名字段类型长度允许空是否主键描述idbigintnullNO是idmember_idbigintnullYESmember_idorder_snchar64YES订单号create_timedatetimenullYEScreate_timemember_usernamevarchar200YES用户名total_amountdecimalnullYES订单总额pay_amountdecimalnullYES应付总额freight_amountdecimalnullYES运费金额statustinyintnullYES订单状态receiver_namevarchar100YES收货人姓名receiver_phonevarchar32YES收货人电话receiver_post_codevarchar32YES收货人邮编receiver_provincevarchar32YES省份/直辖市receiver_cityvarchar32YES城市receiver_regionvarchar32YES区receiver_detail_addressvarchar200YES详细地址payment_timedatetimenullYES支付时间14、商品库存表表3SEQ表\*ARABIC\s114商品库存表字段名字段类型长度允许空是否主键描述idbigintnullNO是idsku_idbigintnullYESsku_idware_idbigintnullYES仓库idstockintnullYES库存数sku_namevarchar200YESsku_namestock_lockedintnullYES锁定库存15、仓库信息表表3SEQ表\*ARABIC\s115仓库信息表字段名字段类型长度允许空是否主键描述idbigintnullNO是idnamevarchar255YES仓库名addressvarchar255YES仓库地址areacodevarchar20YES区域编码4系统实现4.1注册登录功能实现“注册登录模块”实现了用户的注册、用户的普通登录和第三方微博登录功能。当用户输入用户名和密码通过前端ajxa传到后端校验成功之后进入商城首页,失败则提示错误重定向回登录界面。微博扫描二维码登录成功后,会跳转到商城主页,失败则重定向回登录界面。用户为新用户时,则前往注册用户界面进行注册,填写客户账号名和密码,以及通过输入客户的手机号发送验证号码,当输入验证号码与系统中生成的验证码验证一致时,注册成功。将客户数据保存到DataBase中,活动图如下:图41注册登录活动图前端界面设计如下图所示:图42登录界面图图43注册界面图部分核心代码:/**

*用户注册

*/

@Override

publicvoidregister(MemberUserRegisterVovo){

MemberEntitymemberEntity=newMemberEntity();

MemberLevelEntitylevelEntity=memberLevelDao.getDefaultLevel();

memberEntity.setLevelId(levelEntity.getId());

checkUserNameUnique(vo.getUserName());

checkPhoneUnique(vo.getPhone());

memberEntity.setMobile(vo.getPhone());

memberEntity.setNickname(vo.getUserName());

memberEntity.setUsername(vo.getUserName());

BCryptPasswordEncoderbCryptPasswordEncoder=newBCryptPasswordEncoder();

Stringencode=bCryptPasswordEncoder.encode(vo.getPassword());

memberEntity.setPassword(encode);

this.baseMapper.insert(memberEntity);

}/**

*判断用户名是否重复

*/

@Override

publicvoidcheckUserNameUnique(StringuserName)throwsUsernameException{

IntegerusernameCount=this.baseMapper.selectCount(newQueryWrapper<MemberEntity>().eq("username",userName));

if(usernameCount>0){

thrownewUsernameException();

}

}/**

*用户登录

*/

@Override

publicMemberEntitylogin(MemberUserLoginVovo){

Stringloginacct=vo.getLoginacct();

Stringpassword=vo.getPassword();

MemberEntitymemberEntity=this.baseMapper.selectOne(newQueryWrapper<MemberEntity>()

.eq("username",loginacct).or().eq("mobile",loginacct));

if(memberEntity==null){

returnnull;

}else{

Stringpassword1=memberEntity.getPassword();

BCryptPasswordEncoderpasswordEncoder=newBCryptPasswordEncoder();

booleanmatches=passwordEncoder.matches(password,password1);

if(matches){

returnmemberEntity;

}

}

returnnull;

}

/**

*微博用户的登录

*/

@Override

publicMemberEntitylogin(SocialUsersocialUser)throwsException{

Stringuid=socialUser.getUid();

MemberEntitymemberEntity=this.baseMapper.selectOne(newQueryWrapper<MemberEntity>().eq("social_uid",uid));

if(memberEntity!=null){

MemberEntityupdate=newMemberEntity();

update.setId(memberEntity.getId());

update.setAccessToken(socialUser.getAccess_token());

update.setExpiresIn(socialUser.getExpires_in());

this.baseMapper.updateById(update);

memberEntity.setAccessToken(socialUser.getAccess_token());

memberEntity.setExpiresIn(socialUser.getExpires_in());

returnmemberEntity;

}else{

MemberEntityregister=newMemberEntity();

Map<String,String>query=newHashMap<>();

query.put("access_token",socialUser.getAccess_token());

query.put("uid",socialUser.getUid());

HttpResponseresponse=HttpUtils.doGet("","/2/users/show.json","get",newHashMap<String,String>(),query);

if(response.getStatusLine().getStatusCode()==200){

Stringjson=EntityUtils.toString(response.getEntity());

JSONObjectjsonObject=JSON.parseObject(json);

Stringname=jsonObject.getString("name");

Stringgender=jsonObject.getString("gender");

StringprofileImageUrl=jsonObject.getString("profile_image_url");

register.setNickname(name);

register.setGender("m".equals(gender)?1:0);

register.setHeader(profileImageUrl);

register.setCreateTime(newDate());

register.setSocialUid(socialUser.getUid());

register.setAccessToken(socialUser.getAccess_token());

register.setExpiresIn(socialUser.getExpires_in());

this.baseMapper.insert(register);

}

returnregister;

}

}实现通过手机号发送短信使用阿里云的短信服务。当客户按发送验证号码的按钮时,登录服务通过openfeign调用第三方服务中的发送短信接口,将系统中随机生成的六位数字验证码发送到用户手机上。当未通过系统的校验时,则通过BindResult这个vo封装错误信息,并重新定向至注册界面。若通过系统的校验,则需要判断验证号码是否正确,可以从redis中取值,如果正常的话通过客户服务注册,将在ums_member表中保存客户的数据。重定向至登录界页则表示客户服务调用成功,否则封装远程服务返回的错误信息返回至注册页面。图片上传的实现在阿里云中创建Bucket,然后根据阿里云的官方文档整合到我们的系统中,原理如下图:图44上传到OSS原理图短信发送界面如下图:图45手机接收验证码图核心代码如下:@ResponseBody

@GetMapping("/sms/sendCode")

publicRsendCode(@RequestParam("phone")Stringphone){

StringredisCode=redisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX+phone);

if(!StringUtils.isEmpty(redisCode)){

longl=Long.parseLong(redisCode.split("_")[1]);

if(System.currentTimeMillis()-l<60000){

returnR.error(BizCodeEnum.SMS_CODE_EXCEPTION.getCode(),BizCodeEnum.SMS_CODE_EXCEPTION.getMsg());

}

}

intcode=(int)((Math.random()*9+1)*100000);

StringcodeNum=String.valueOf(code);

StringredisStorage=codeNum+"_"+System.currentTimeMillis();

redisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX+phone,

redisStorage,10,TimeUnit.MINUTES);

thirdPartFeignService.sendCode(phone,codeNum);

returnR.ok();

}@GetMapping(value="/sendCode")

publicRsendCode(@RequestParam("phone")Stringphone,@RequestParam("code")Stringcode){

smsComponent.sendSmsCode(phone,code);

returnR.ok();

}@Component

@ConfigurationProperties(prefix="spring.cloud.alicloud.sms")

@Data

publicclassSmsComponent{

privateStringaccessKeyId;

privateStringsecret;

privateStringsysVersion;

privateStringsignName;

privateStringtemplateCode;

publicvoidsendSmsCode(Stringphone,Stringcode){

DefaultProfileprofile=DefaultProfile.getProfile("cn-hangzhou",getAccessKeyId(),getSecret());

IAcsClientclient=newDefaultAcsClient(profile);

CommonRequestrequest=newCommonRequest();

request.setSysMethod(MethodType.POST);

request.setSysDomain("");

request.setSysVersion("2017-05-25");

request.setSysAction("SendSms");

request.putQueryParameter("RegionId","cn-hangzhou");

request.putQueryParameter("PhoneNumbers",phone);

request.putQueryParameter("SignName",getSignName());

request.putQueryParameter("TemplateCode",getTemplateCode());

request.putQueryParameter("TemplateParam","{\"code\":\""+code+"\"}");

try{

CommonResponseresponse=client.getCommonResponse(request);

System.out.println(response.getData());

}catch(ServerExceptione){

e.printStackTrace();

}catch(ClientExceptione){

e.printStackTrace();

}

}

}4.2搜索商品功能实现搜索商品功能的实现将请求参数的封装到SearchParam这个vo中,返回参数则封装在名字为SearchResult的vo中。然后在service层,将封装好的SearchParam组建查询条件,再将返回后的结果封装成SearchResult,在页面中渲染出来。前端界面展示如下图:图46商品列表图部分核心代码展示:

@Override

publicSearchResultsearch(SearchParamsearchParam){

SearchResultresult=null;

SearchRequestsearchRequest=buildSearchRequest(searchParam);

try{

SearchResponseresponse=client.search(searchRequest,YanlaimallElasticSearchConfig.COMMON_OPTIONS);

result=buildSearchResult(response,searchParam);

}catch(IOExceptione){

e.printStackTrace();

}

returnresult;

}商品详情页的实现先将sku的信息抽取到SkuItemVo中,在service层中将这些信息通过model用thymeleaf在前端页面渲染出来。通过spuId和catalog_Id在数据库中查询对应规格参数,所以我们需要通过productms_attr_group表获得catalog_Id的值和attr_GroupName的值,然后通过查询productms_attr_attrgroup_relation来获取对应分组的id属性,spuId对应的属性值通过productms_product_attr_value查询,联表含有需要的所有属性展现最终的数据效果。前端页面展示如下图:图47商品详情图部分核心代码展示:@Override

publicSkuItemVoitem(LongskuId)throwsExecutionException,InterruptedException{

SkuItemVoskuItemVo=newSkuItemVo();

CompletableFuture<SkuInfoEntity>infoFuture=CompletableFuture.supplyAsync(()->{

SkuInfoEntityinfo=this.getById(skuId);

skuItemVo.setInfo(info);

returninfo;

},executor);

CompletableFuture<Void>saleAttrFuture=infoFuture.thenAcceptAsync((res)->{

List<SkuItemSaleAttrVo>saleAttrVos=skuSaleAttrValueService.getSaleAttrBySpuId(res.getSpuId());

skuItemVo.setSaleAttr(saleAttrVos);

},executor);

CompletableFuture<Void>descFuture=infoFuture.thenAcceptAsync((res)->{

SpuInfoDescEntityspuInfoDescEntity=spuInfoDescService.getById(res.getSpuId());

skuItemVo.setDesc(spuInfoDescEntity);

},executor);

CompletableFuture<Void>baseAttrFuture=infoFuture.thenAcceptAsync((res)->{

List<SpuItemAttrGroupVo>attrGroupVos=attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(),res.getCatalogId());

skuItemVo.setGroupAttrs(attrGroupVos);

},executor);

CompletableFuture<Void>imageFuture=CompletableFuture.runAsync(()->{

List<SkuImagesEntity>imagesEntities=skuImagesService.getImagesBySkuId(skuId);

skuItemVo.setImages(imagesEntities);

},executor);

}4.3购物车功能实现用ThreadLocal进行用户身份鉴别信息传递在点击进入购物车时,会为企业项目临时进行用户可以生成提供一个name为user-key的cookie临时标识,过期使用时间为一个月,如果我们手动方式清除user-key,那么对于临时购物车的购物项也被清除,所以user-key是用来作为标识和存储系统临时购物车信息数据的。在调用购物车的接口前,首先使用会话信息确定是否登录。并分别进行用户身份信息的封装,并并将用户密钥放入cookie中,通过拦截器进行完成。添加商品到购物车获取当前以当前用户标识为key的hash的操作,判断当前购物车是否已经存在我们需要的产品,如果已经存在购物车之中,将数据取出并添加商品数量,将json转为对象并将count+,更新后的对象被转换成json并存储在redis中,未存在购物车,则添加新商品,通过远程商品服务查询sku基本信息和属性组合信息,将该产品属性进行封装并存入redis,登录用户使用用户ID作为密钥,否则使用user-key获取购物车用户未登录,直接通过user-key获取临时购物车。用户登录,查询userId对应的购物车,查询user-key对应的临时购物车,并和用户购物车合并,在redis中更新数据,删除临时购物车数据,选中购物车项,通过修改修改skuId对应购物车项的选中状态。前端页面展示如下图:图48商品购物车图部分代码如下:/**

*添加商品到购物车

*/

@GetMapping(value="/addCartItem")

publicStringaddCartItem(@RequestParam("skuId")LongskuId,

@RequestParam("num")Integernum,

RedirectAttributesattributes)throwsExecutionException,InterruptedException{

cartService.addToCart(skuId,num);

attributes.addAttribute("skuId",skuId);

return"redirect:/addToCartSuccessPage.html";

}

/**

*商品是否选中

*/

@GetMapping(value="/checkItem")

publicStringcheckItem(@RequestParam(value="skuId")LongskuId,

@RequestParam(value="checked")Integerchecked){

cartService.checkItem(skuId,checked);

return"redirect:/cart.html";

}

/**

*改变商品数量

*/

@GetMapping(value="/countItem")

publicStringcountItem(@RequestParam(value="skuId")LongskuId,

@RequestParam(value="num")Integernum){

cartService.changeItemCount(skuId,num);

return"redirect:/cart.html";

}

/**

*删除商品信息

*/

@GetMapping(value="/deleteItem")

publicStringdeleteItem(@RequestParam("skuId")IntegerskuId){

cartService.deleteIdCartInfo(skuId);

return"redirect:/cart.html";

}下单的实现先使用拦截器统一获取登录信息,只有登录才能进行下单操作。远程购物车服务查询用户选中的购物信息。根据userId远程用户服务在uerms_user_address表中获取收货地址,用过skuId远程进行商品管理服务可以查询sku的信息,同时远程库存服务查询是否有库存,有则可以提交订单,无库存返回信息到订单页面上。当用户点击提交订单按钮,收集页面数据提交到后台并生成订单数据。验证令牌防止重复提交,然后验证产品的价格,验证产品的库存,并锁定产品的库存。生成客户的购物订单,最后购物车中对应的记录通过消息队列删除。可能出现客户下单之后一直不付钱,产品的库存处于锁定状态,陷入店家的产品卖不出,其他购买的买家无法购买的情况。所以,关闭锁定的客户订单需要通过延时队列定来完成。前端页面展示如下图:图49订单确认页图支付的实现系统通过内网穿透实现请求名称为alipay.Trade.page.pay支付宝界面,商家请求参数通过支付宝验证后,重定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论