综合性B2C电商平台设计与实现
近些年,随着当今世界的互联网发展,为生活的方方面面提供了极大的便利。其中最为典型的电商借着这股东风已经成为了社会不可或缺的一环。相关行业也在不断拓展和完善,对经济社会生活产生了极大的促进,同时也成为我国经济发展的重要一环。
电商平台的使用,通过网上购物为人们在生活上提供极大的便利,使人们不受时间和空间的限制,在家里就能实现购物。同时对于商家来说,商家可以入驻平台实现商品发布和出售,在线上实现订单的过程,而只需要通过线下发货和物流信息的发布完成订单,能极大增加商家的销售渠道和在时间上的便利。
此平台的的研究工作中,结合实际情况对比,在使用分布式服务架构(RPC)的前提下,结合服务治理框架dubbo,zookeeper作为注册中心,并结合使用了Spring、SpringMvc、Mybatis的SSM框架。借助Linux虚拟机,搭载各类第三方技术,比如vsftpd文件上传服务器;nginx反向代理,负载均衡;redis集群配置主从复用,读写分离,搭建主备切换;solr搜索引擎和sso单点登录等。
利用相关技术开发平台,先后实现完成了后台管理系统和前台门户系统。后台完成简单的商品管理功能,权限属于管理员。前台则实现完成了基本的用户注册登录;首页商品的浏览和搜索;经典的电商平台购物车功能;订单核对提交订单;支付宝在线支付功能;前后台的单点登录功能。前后台共同构成了一个完整的B2C电商平台。
就本平台的功能和测试结果来看,综合性B2C电商平台满足了预期的用户和管理功能需求,实现了平台的架构的解耦分层,良好的高并发和高可用性能。测试结果证明了分布式架构在电商平台中的高效性和可行性,获得了应有的使用价值。
【关键词】分布式架构;SSM;Linux;电商平台
[锚点] 1 前言
[锚点] [锚点] 1.1 课题的背景近些年,随着当今世界的互联网发展,为生活的方方面面提供了极大的便利。其中最为典型的电商借着这股东风已经成为了社会不可或缺的一环。相关行业也在不断拓展和完善,对经济社会生活产生了极大的促进,同时也成为我国经济发展的重要一环。1.2 目的和意义电商平台的使用,通过网上购物为人们在生活上提供极大的便利,使人们不受时间和空间的限制,在家里就能实现购物。同时对于商家来说,商家可以入驻平台实现商品发布和出售,在线上实现订单的过程,而只需要通过线下发货和物流信息的发布完成订单,能极大增加商家的销售渠道和在时间上的便利。
电商平台给人们的生活带来了极大的变化,极大的发挥了消费水平,促进了经济发展。在电商平台上购物也不受时间和空间上的影响,方便业务管理,也解决了消费者的购物问题。1.3 国内外现状和发展趋势网络营销的热潮已经席卷全球,国内外企业的生存竞争空间已经从传统市场转向网络空间市场。网上购物已经渗透到国内外市场的方方面面,极大的改变了人们的工作和生活方式。天猫双十一成交额的逐年变化是一个最好的提现,从2009年的0.5亿元到现在2021年的5403亿元,实现了大跳跃。2021年上半年我国网络购物用户规模为8.12亿人,占网民整体的80.3%。人们的生活已经离不开网上购物,特别是在如今的疫情时期,网络电商平台的作用更加重要。
在如今互联网的发展带动下,足不出户的网上购物基本成为必需。在未来会有越来越多的人们加入这个行业。网络电商平台也将会朝着全球化,个性化,专业化的趋势发展和改善,以至于改变全球的经济结构,前途不可估量。1.4 论文架构本论文通过七个部分详细讲述综合性B2C电商平台的设计与实现。
第一部分前言,分析课题背景和国内外现状,说明目的和意义,表明研究内容,简述本文架构。
第二部分电商平台的相关技术,分别对综合性B2C电商平台所运用到的相关技术加以介绍。
第三部分是电商平台的需求分析,先后分析功能性和非功能性需求,且加以用例图描述。
第四部分是电商平台概要设计,通过第三部门的需求分析对平台从架构搭建到各类服务组件,从个功能模块设计到数据库设计。
第五部分是电商平台详细设计与实现,从平台架构详细设计到平台功能详细设计,展示核心功能接口和部分核心代码,且附上最终的页面效果。
第六部分是电商平台测试,对平台进行细致的功能测试。
综上所有,在论文的最后部分做了相关工作的总结与展望。
[锚点] 2 电商平台的相关技术
[锚点] 2.1分布式服务架构(RPC)互联网的快速发展下,传统的垂直应用架构已经无法满足日渐壮大中的网站规模的需要,分布式服务和流动计算架构就成如今新的血液,甚至于微服务架构。
图2-1 开发模式的演变
传统的单一应用架构,在网站流量很少的情况下,虽然只需要一个应用,但是缺点也很明显。由于所有功能都部署在一起,即使成本很低,但是在应用功能不断增多的情况下,随着代码量的不断增大,也变得越来越难维护。
垂直应用架构,为了提高效率将应用分开成若干个不相关的应用。但是缺点也依然是明显的,在这个架构下,相同逻辑的代码需要反复复制,不得复用。
分布式服务架构,随着垂直应用的增加,各个应用之间的交互是不可避免的。分布式服务架构分离独立出核心业务服务,构成一个稳定的服务中心,前端的应用程序能够迅速应对变化的市场需求。分布式服务架构的缺点是,服务的增加,各服务地址管理成为必要,调用依赖关系也更为复杂,服务状态不好管理,没法根据实际服务情况进行动态管理。
因此,本平台的开发,在分布式服务架构的基础上,为了解决其缺点,结合服务治理框架dubbo,zookeeper作为注册中心,以达到服务统一调度管理的目的,解决远程调用的难题,开发也从面向对象跳转到了面向服务,比以往更加的松耦合,而实际上这个时候已经成为了一个微服务[9]架构。
[锚点] 2.2 RPC协议(Remote Procedure Call Protocol)即不需要理解底层网络技术,而是通过网络在远程计算机程序上请求程序的远程过程调用协议。RPC协议假设存在若干传输协议,诸如tcp或udp,在通信程序之间传输信息数据。在OSI网络协议模型中,RPC实现了传输层和应用层之间的跨界,从而有助于开发包含网络分布式多程序的应用。
RPC是客户端/服务器模式。客户端请求程序,服务器提供程序。客户端调用进程,向服务进程发出调用数据,并等待数据的响应。服务器在呼叫数据到达之前,最初保持睡眠状态。一个调用数据到达的情况下,服务器得到进程参数,结算结果,应答数据返还,其次等待下一个数据,最终客户端接收应答数据和结果,继续执行调用。
图2-2 RPC过程处理示例图
从上图中可以清晰的看出RPC的执行流程。
[锚点] 2.3服务治理框架Dubbo和注册中心Zookeeper服务治理框架Dubbo[3]:
Dubbo是Alibaba开发推出的一个远程调用框架。Dubbo具有基于接口的远程调用,负载均衡和容错,服务的自动注册和发现三个核心功能。在阿里巴巴内部,Dubbo得到了广泛的应用,很多大型互联网公司也在用,比如考拉,当当,京东等等。
Dubbo Architecture:
图2-3 Dubbo工作原理示例图
节点角色说明:
Provider:服务提供方
Consumer:服务消费方
Register:注册中心
Moniter:监控中心
Container:服务运行容器
调用关系说明:
1.服务容器负责启动、加载、运行服务提供者
2.服务提供者启动并向注册中心注册自身提供的服务
3.服务消费者启动并向注册中心订阅自己所需的服务
4.注册中心列表给消费者返回提供者地址,如果有所变动注册中心会基于长连接发送变动数据给消费者
5.基于软负载均衡算法,消费者在地址列表里选择一台提供者调用,如果失败则调用另一台
6.服务提供者和服务消费者在内存中累计的调用次数和调用时间定时每分钟发送一次统计数据至监控中心
注册中心Zookeeper:
Zookeeper作为分布式应用程序协调服务,开源实现了谷歌的Chubby,所提供的功能有:分布式同步,配置维护,域名服务,租服务等,是一个为分布式应用提供一致性服务的软件。
在本平台中,Zookeeper身为服务注册中心,注册着编写的服务供客户端远程调用。
Zookeeper注册中心是Dubbo官方推荐,负责服务地址的注册和发现,也就是目录服务。适合作为Dubbo的服务注册中心在于其适合生产环境且工业强度高。
[锚点] 2.4 Spring、SpringMVC和Mybatis框架
[锚点] 2.4.1 Spring框架Spring是为了解决企业级应用开发的复杂性,简便Java开发而诞生的,是一个由Rod Johnson开发的为开发者提供一站式应用开发平台的轻量级开源Java框架。Spring为Java应用程序开发提供全面的基础架构支持,所以Java开发者可以致力于应用程序的开发。在JavaEE开发中,支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;Spring通过IOC容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IOC容器,实现解耦。
Spring丰富的功能给企业级开发提供极大便利。依赖注入(DI)和面向切面编程(AOP)是这些功能的底层依赖。Spring框架的核心是IOC容器和AOP模块。通过IOC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务,把遍布于应用各层的功能分离出来形成可重用的功能组件。
图2-4 Spring5模块结构图
[锚点] 2.4.2 SpringMVC框架Spring MVC[10]是一个基于Java的轻量级web框架,它实现了请求驱动型MVC设计模式。通过分离模型视图控制器,解耦web层的职责,将复杂的web应用程序划分为几个具有清晰逻辑的部分,简化了开发,减少了错误,促进了团队开发人员之间的合作。
Spring MVC中有许多重要组件,如下:
(1)前端控制器 DispatcherServlet
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
(4)处理器Handler(需要程序员开发)
(5)视图解析器ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口,它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
Spring MVC的工作流程:
图2-5 Spring MVC工作流程图
[锚点] 2.4.3 Mybatis框架Mybatis是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
Mybatis工作原理:
图2-6 Mybatis工作原理流程图
[锚点] 2.5 Vsftpd文件服务器和Nginx服务器Vsftpd文件服务器:
Vsftpd是一个运行在Unix类操作系统上的服务器,也能运行在比如Linux[1],Solaris,Bsd,Irix上。本系统使用中,Vsftpd运行在Linux上,它 相比于其他的ftp服务器提供了更多的支持,也是Linux发行版里广为推荐的ftp服务器程序。
本平台使用Vsftpd文件上传服务器,将文件(图片)上传至该服务器上,进行统一的独立管理,需要拿到服务器上文件(图片)的时候,只需要携带地址发出请求即可。
Nginx服务器[8]:
Nginx是一个高性能、轻量级的HTTP和反向代理web服务器。它也是一个电子邮件服务器,提供IMAP / POP3 / SMTP服务,由俄罗斯人Igor sesoyev开发,源代码以类似BSD许可证的形式发布。稳定性高,系统资源消耗低,配置文件简单,功能集丰富是其优点,在中国大陆得到了广泛的应用。
正因为其高性能的反向代理和负载均衡,本平台中选择使用Nginx,并将其搭载在Linux上,配置了三台Tomcat[2]服务器的反向代理负载均衡。
[锚点] 2.6 Redis缓存数据库Redis[5]是一个ANSI C语言编写,支持网络,可基于内存也可持久化的日志型,Key-Value数据库,而且提供了许多语言的API,是一个开源的非关系型数据库。Redis的诞生实际上是因为Mysql数据库的低性能,所以一家意大利公司的创始人Salvatore Sanfilippo为了避免这一问题而亲自开发了Redis缓存数据库,事实证明,Redis的高性能是Mysql所无法匹及的。
Redis所支持的语言有很多,比如常用的Java,C,C++,Python,Php,Go等等。在数据类型上,Redis支持string,set,hash,list,sorted set这五种。
本平台中Redis正是用于数据库缓存,存储前台数据量庞大的数据,是介于持久层和服务层之间的,配置了主备切换,读写分离。比如前台商品分类栏,当刷新页面时,会先从Redis缓存中查询数据,若存在缓存则返回数据,若不存在缓存,这个时候Redis便会访问Mysql数据库得到数据返回,并在Redis上相应缓存。以这种方式打到减缓Mysql数据库压力的目的,提升商城平台的整体性能。
[锚点] 2.7 Solr搜索引擎Apache Solr是一个独立的企业级搜索应用服务器,其对外提供类似Web-service的API接口。用户经过HTTP请求,且得到XML格式的返回结果,而且通过用类似REST的HTTP API保证我们能可以使用Solr通过几乎任何编程语言。在如今的生活里,搜索引擎的使用不可或缺,各式各样的网站往往都有搜索功能,而搜索伴随的是相当庞大的资源消耗,这对于数据库来说是相当沉重的,沉重的加载难免会拖慢甚至拖垮我们的应用,因此搜索引擎为我们解决了这一问题。
Solr实际上是基于Lucene封装的,Lucene同样是一个搜索引擎工具,Solr和Lucene两者的索引库也是公用的。不过因为Solr是基于Lucene封装的,因此Solr的操作更加的简单人性化,它是一个企业级的开源搜索平台,广泛被用于构建搜索应用程序,是建立在Lucene之上的,具有高速可扩展以及快速的性能。
相比于Mysql,Solr是一个不同的产品,虽然两者都有索引,但是索引的文件并不是同种文件,前者的查询和后者的搜索也不是一个概念。Mysql为Solr提供了索引数据的来源,Solr从Mysql中存储的数据进行分析得出索引库。
[锚点] 2.8 SSO单点登录SSO单点登录是一种流行的企业业务集成解决方案。SSO是在多个应用程序系统中定义的。用户可以通过一次登录访问所有相互信任的应用系统。在实现单点登录时,所有应用系统都需要共享一个身份认证系统,这是单点登录的前提条件之一。应用系统应该能够识别并提取票据,当用户首次登录时能够识别登录的用户,而认证系统应该对票据进行验证,验证其合法性。
图2-7 SSO实现原理图
如果用户第一次访问应用系统时没有登录,则会被定向到认证系统进行登录。首先,根据用户输入的登录信息对用户进行身份验证。如果认证通过,经过身份验证票将返回给用户,然后用户可以使用这张票作为身份验证票访问其他应用系统,收到票后,应用系统将其发送给验证确认其合法性的验证系统。一旦通过了验证,用户就可以访问其他系统而无需再次登录。
[锚点] 2.9 RabbitMQ消息队列消息队列(MQ)在计算机科学里是一种进程间通信或同一进程的不同线程间的通信方式,在软件里处理一系列来自用户的输入。MQ的模型是消费者-生产者,一端不断写入消息到消息队列中,另一端订阅或读取队列中的消息,MQ遵循了AMQP协议,本平台选用的RabbitMQ是众多消息队列开源实现中的一个。
RabbitMQ是一个开源的AMQP实现,以Erlang语言编写的服务器端,支持数种客户端,比如常用的JAVA,PYTHON,RUBY,C等等,同时也支持AJAX。因为其在易用性,扩展性,高可用性等方面表现出色,所以被广泛应用于分布式系统中存储转发信息。
使用RabbitMQ的原因有很多,比如基于AMQP协议,高并发,高性能,高可用,支持插件和多语音,由于被广泛使用,所以有强大的社区支持。对于AMQP,这是一个高级消息队列协议,面向消息,队列,路由,可靠性,安全,是应用层协议的一个开放标准,为面向消息的中间件而设计。
[锚点] 2.10 其他第三方技术支付宝开放平台(Alipay):
使用支付宝开放平台官方提供的支付宝支付API实现商城的在线支付,选择的是平台里的沙箱环境实现支付宝在线支付的集成。
图2-8 支付宝开放平台官方主页
邮件发送:
邮件发送上选择的是网易163邮箱,通过开启网易163邮箱里的SMTP服务,然后在系统里编程开发实现注册成功后邮件的发送,发送方是网易163邮箱,接收方是自己输入的存在的邮箱,不限于只是网易163邮箱。
图2-9 163邮箱设置截图
GEETEST极验验证:
GEETEST极验验证在计算机领域里用于区别机器人和自然人,通过官方提供的方式进行简单集成,就能给开发者提供安全、便携的云端验证服务。
图2-10 GEETEST极验验证官方行为验证截图
[锚点] 3 电商平台的需求分析在本章中,将会对本电商平台的需求进行分析,从功能需求和非功能需求两个角度分析。功能需求是从用户的角度出发分析各个平台功能的需求和操作流程,非功能需求则是分析用户和平台性能上的使用体验,安全可靠性等。
这是本次平台开发最初的一环也是最重要的,需求分析能为接下去的平台开发提供蓝图,给平台开发设计做到极大的便利。
[锚点] 3.1 平台功能需求简述后台管理系统和前台门户系统。后台完成简单的商品管理功能,权限属于管理员。前台则实现完成了基本的用户注册登录;首页商品的浏览和搜索;订单核对提交订单;前后台的单点登录功能;在购物车里提交订单填写需要的信息,并跳转支付页面完成在线支付。如图所示:
图3-1 系统功能划分图
[锚点] 3.2 平台功能需求分析
[锚点] 3.2.1 注册登录功能需求分析注册登录功能是电商平台上的一个基础功能,注册用户的信息会被得到保存以供平台为用户提供相应的服务。在此平台里,未注册的用户身为游客,不拥有查看或添加至购物车,提交订单,在线支付等功能。注册登录后拥有使用前台门户系统的所有功能的权限,具体如下:
未注册用户:进入首页,需要注册时可以点击“免费注册”按钮跳转至注册页面,填写相应的正确信息之后,进行极验验证和勾选同意协议最后点击进行注册,信息错误的话给予提示以重新填写注册。注册成功后在页面上给用户反馈提示“注册成功”并跳转登录页面,后台发送注册邮件到对应的用户邮箱。
已注册用户:有两种方式可以进入到登录页面,第一种是新注册完成后的自动跳转至登录页面,第二种则是可以在平台首页上点击“登录”按钮跳转至登录页面。进入登录页面之后,用户根据页面提示输入用户名和密码,填写正确的话提示“登录成功”并跳转至平台首页;填写错误的话则提示“用户名或密码错误”,重新输入再次登录。如图所示:
[锚点] 图3-2 注册登录功能用例图
[锚点] 3.2.2 后台商品管理功能需求分析平台管理员通过后台网址访问进入后台登录页面,在正确输入用户名、密码和验证码之后成功登陆则跳转至后台首页。后台中有商品管理这一功能模块,其中分别有五个功能:
商品分类:对商品分类实行分级管理,所有商品分类被查询出后分级显示在页面上,管理员可以进行新增分类,编辑修改分类并保存,删除分类的操作。
商品列表:进入页面后所有商品被后台查询出后分页显示在页面上,页面处理后可以进行上下页的切换和相应页码的跳转。可以通过选择分类,品牌或者关键字搜索出对应的商品。管理员可以新增商品,编辑和修改商品信息(包括通用信息,商品相册,商品模型等),删除商品。
商品模型:商品模型用于规定某一类商品共有规格和属性的集合。商品模型被后台查询后显示在页面上,管理员可以新增商品模型,编辑和修改商品模型信息和删除商品模型。
商品规格:商品模型下的一个子集,可以选择分类筛选查询规格显示在页面,管理员可以新增商品规格,编辑修改规格信息和删除规格。
商品属性:商品模型下的另一个子集,可以选择分类筛选查询属性显示在页面,管理员可以新增商品属性,编辑修改属性信息和删除属性。如图所示:
图3-3 商品管理功能用例图
[锚点] 3.2.3 前台商品搜索功能需求分析前台上的搜索框为用户提供方便快捷的商品搜索,这里利用到的是Solr搜索引擎。用户可以通过输入商品关键字,名称或者是品牌来搜索商品,搜索到的商品信息会返显在前台页面上,达到更加方便人性化的目的,而不需要在页面上逐个浏览寻找商品。这里的搜索功能并不受注册登录的影响,即使是以游客的身份访问前台也可以使用搜索功能。
流程:用户进入平台首页点击搜索框,输入关键字,商品名称或者品牌名称后点击“搜索”按钮。如果搜索的商品存在则搜索成功,相应的商品返显在页面;如果搜索的商品不存在则搜索失败,页面显示空白。如图所示:
[锚点] 图3-4 搜索功能用例图
[锚点] 3.2.4 前台购物车功能需求分析平台上的购物车功能用于存储用户想要购买的商品或者所以喜爱的商品,购物车列表里显示这用户所添加的商品信息,包括商品名称,数量,价格等,用户可以对其进行相应操作,另外购物车功能不支持游客身份使用。
向购物车添加和保存物品:用户可以通过单击商品信息栏中的购物车图标按钮向购物车添加物品,并可以重复添加。点击页面上的购物车按钮,跳转到购物车页面,显示用户添加到购物车中的所有商品(包括商品信息、总数量和总价),用户可以修改相应商品的数量。
删除购物车中的商品:用户可以删除单个商品或清空购物车,相应的数量和价格会随着删除而改变。
修改购物车中的商品数量:用户可以点击“+”“-”按钮来修改购物车中的商品数量,相应的数量和价格也会随着数量的变化而变化。
去结算:购物车页面里的去结算按钮,结算购物车商品并跳转至订单页面。
[锚点] 图3-5 购物车功能用例图
[锚点] 3.2.5 前台订单功能需求分析提交订单这一功能,一是给用户核对订单信息,包括商品清单,地址信息,价格等等;二是用户点击提交订单按钮跳转至支付页面,这一功能不支持游客身份使用。
用户在购物车点击“去结算”按钮跳转至核对订单页面。
进入核对订单页面后,用户核对商品清单,价格,地址等等信息。
用户确认无误后,点击“提交订单”按钮跳转至订单提交成功页面,于此同时,购物车里的商品需要得到清空,相应的后台数据库也是,可以点击“去付款”按钮跳转支付页面。如图所示:
图3-6 提交订单功能用例图
[锚点] 3.2.6 前台支付功能需求分析支付功能为用户提供虚拟的在线支付,采用的是支付宝开放平台的支付宝在线支付体验,在登录相应支付宝账号之后便可点击支付完成购买。
在提交订单成功页面点击“去付款”按钮跳转至支付页面。
登录用户支付宝账号后,可以进行支付购买,不支付的话订单会处以未支付的状态在一定时间之后消除。
支付成功后,自动跳转只平台首页,后台相应生成订单信息,支付时间等。
[锚点] 图3-7 支付功能用例图
[锚点] 3.3 平台非功能需求分析效率性能:
为了给用户良好的体验,本电商平台在海量数据下也要具备较高性能的能力,尽量控制用户请求的响应时长相对较低,还要做到高并发量满足平台的高并发需求。
安全性[7]:
因为此平台是供用户购物的,所以会有很多的用户信息,比如基本的用户账号密码,邮箱手机号,地址等。需要确保绝对的安全性,以保证用户的相关信息安全保密,避免不必要的非法操作而导致信息泄露造成损失。
可靠性:
本平台是在分布式架构下开发的微服务系统,多个子系统组成。需要确保整个平台的可靠性,在某些特定环境下也不易出错,还要考虑某个子系统故障时尽量不影响其他系统的使用。
可扩展性:
作为一个综合的电商平台,在考虑必要的效率和安全可靠性能下同样也得考虑未来后续平台的优化升级。这就需要一个良好扩展性,减少未来优化升级开发中不必要的麻烦,以便更好的维护平台。
[锚点] 4 电商平台概要设计本章的概要设计面向开发者对用户需求从构建系统的角度进行重构,包含四部分。一个是平台整体系统架构的设计;第二个是平台相关服务器的架构设计;第三个则是根据用户的功能需求进行功能模块的概要设计;最后一个是数据库的设计。
[锚点] 4.1 平台系统架构设计平台在基于MVC的模式下,在三层架构的基础下设计分布式服务架构,做到面向服务。微服务方面使用Dubbo服务治理框架和Zookeeper注册中心构建RPC框架,实现远程调用和服务的统一调度管理。如图所示:
图4-1 电商平台整体架构设计图
[锚点] 1.表现层:
这是电商平台的业务控制层,业务上包括前台门户系统,后台管理系统,搜索系统和订单系统。控制层根据客户端浏览器发出的不同请求调用对应的业务控制模块。不同的Controller为不同的请求服务,调用服务层且以View的形式返回。
[锚点] 2.服务层:
服务层在三层架构中起到一个承上启下的作用,对下使用持久层的接口,对上为控制层提供接口,作为业务逻辑层,一个Service方法完成一个功能。
[锚点] 3.持久层:
起到与数据库通信的作用,且为服务层提供接口,是一个数据访问层。当服务层发送请求,持久层接收并完成相应的增删改以及数据访问操作。
[锚点] 4.2 相关服务器架构设计本电商平台拥有多台服务器,外加数据库,多数部署在部署在VMware虚拟机的Linux环境下。一个Vsftpd文件上传服务器,一个Nginx服务器实现反向代理负载均衡,三个Tomcat服务器构成的一个集群,通过Nginx服务器实现集群上的反向代理负载均衡;数据库上有两个两个持久化的Mysql数据库,一个部署在Linux环境下为索引库提供数据来源,一个部署在Window环境下为整个平台提供数据;一个Redis缓存数据库;一个Solr搜索引擎索引库。
Vsftpd文件上传服务器:作为商品图片的存放服务器,通过Nginx反向代理Tomcat服务器携带地址访问Vsftpd上的图片。
Nginx服务器:部署一台Nginx服务器,起到为Tomcat服务器集群反向代理负载均衡的作用,而且对Vsftpd上图片的访问就是先通过Nginx服务器的反向代理到Tomcat服务器上的。
Tomcat服务器:三台Tomcat服务器构成一个集群,提供Http请求等。
Redis缓存数据库:Redis作为缓存数据库缓存数据,减轻Mysql的压力,是一个非关系型数据库。Redis搭载在Linux环境下,有一台主机和两台从机构成一个集群,实现了主备切换读写分离,避免以为宕机而导致数据丢失。
Solr搜索引擎索引库:此索引库为平台前台的搜索提供服务,加快搜索效率的同时减轻Mysql数据库的压力,而索引库中的数据来源于Mysql数据库,由Solr索引库自身整理而来。
Mysql数据库[4]:配置两种不同环境下的Mysql为平台服务。一个在Window环境下,存放整个平台的用户信息和商品信息等;另一个在Linux环境下,作用是为Solr搜索引擎索引库提供数据来源。
[锚点] 4.3平台功能概要设计
[锚点] 4.3.1 前台注册功能概要设计注册页面可从两个地方进入,第一个平台首页的“免费注册”按钮,第二个是登录页面里的“注册新用户”按钮,通过以上两种方式跳转至注册页面。在注册页面的表单里,填写邮箱,用户名和密码,点击极验验证进行行为验证,一切都正确填写之后,点击“提交注册”按钮完成注册。当注册成功时,提示用户“注册成功”随后跳转至登录页面,于此同时后台发送注册邮件到用户所填写的邮箱,如果注册失败则根据提示重新填写注册。其中行为验证用到的是GEETEST极验验证,邮件发送使用的是网易163邮箱的SMTP服务。
[锚点] 4.3.2 登录功能概要设计通过点击平台首页的“请登录”按钮跳转至登录页面,输入用户名和密码并进行验证,验证错误则提示“用户名或密码错误”,验证成功则跳转至平台首页。由于本平台属于前后台分离,所以登录功能上做了SSO单点登录的技术。如果用户第一次访问应用系统时没有登录,则会被定向到认证系统进行登录。首先,根据用户输入的登录信息对用户进行身份验证。如果认证通过,经过身份验证票将返回给用户,然后用户可以使用这张票作为身份验证票访问其他应用系统,收到票后,应用系统将其发送给验证确认其合法性的验证系统。一旦通过了验证,用户就可以访问其他系统而无需再次登录。另外,当游客想要使用用户才具备的功能时,比如购物车功能等等,则把页面自动跳转至登录页面提示用户先登录。
[锚点] 4.3.3 后台商品管理功能概要设计商品分类:在后台管理平台点击商品管理下的“商品分类”按钮进入分类页面,页面上三层分级显示所有的商品分类,可以通过点击“展开”“收缩”按钮进行分级展开和收缩的操作。点击“新增分类”按钮跳转新增页面,在页面表单上正确填写各项信息,除了文字信息外还有一个图片上传的功能,填写完成后可以点击“提交”完成新增并保存至数据库。新增页面上还有返回分类页和重新清空表单信息的两个按钮。点击编辑图标跳转编辑页面对相应分类信息进行编辑修改。点击删除图标则可以删除相应的分类信息并清理数据库的信息。
商品列表:商品列表展示着平台所有的商品,可以通过下拉框选择分类或者是平台查询商品,也可以通过关键字搜索,由于商品数量多,实现分页技术方便用户使用。商品列表里可以添加新商品,其中包括通用信息,商品相册,模型。在列表页,通过点击编辑和删除图片,可以进行对应商品的编辑修改和删除。
商品模型:由于商品模型是规定一类商品公有规格和属性的集合,所以模型页面上在展示模型的同时,设计“属性列表”和“规格列表”两个按钮分别跳转至对应页面。商品模型可以通过点击按钮跳转新增页面新增模型,也可以点击编辑和删除图标进行相应的编辑修改和删除。
商品规格:作为商品模型的一个子集,在做到常规的规格页面展示外,可以通过下拉框选择展示某个模型下的规格。同样应该就被新增,编辑修改和删除按钮进行对应操作。
商品属性:作为商品模型的一个子集,在做到常规的属性页面展示外,可以通过下拉框选择展示某个模型下的属性。同样应该就被新增,编辑修改和删除按钮进行对应操作。
[锚点] 4.3.4 前台商品搜索功能概要设计前台商品功能的设计,搭载Solr搜索引擎,实现快速的关键字搜索,为Mysql数据库减轻压力且为用户提高体验感。在搜索框内输入关键字信息后,点击“搜索”按钮实现商品的搜索,搜索成功商品展示至前台首页。因为商品数量的问题以及使用体验,搜索而展示的商品进行分页展示。
[锚点] 4.3.5 前台购物车功能概要设计前台购物车功能的设计上,页面上每件商品都会有一个购物车图标,用户通过点击商品信息栏中的购物车图标按钮便可以将商品添加至购物车,且可重复添加。点击页面上的购物车按钮可跳转至购物车页面,显示着用户添加至购物车的所有商品(包括商品信息,总数量及总价格),用户可以对相应商品修改数量。用户可以删除单个商品或者清空购物车,相应的数量和价格也会随着删除而变化。用户可以通过点击“+”,“-”按钮修改购物车里商品的数量,同时相应的数量和价格也会随着数量的改变而变化。购物车页面里的去结算按钮,结算购物车商品并跳转至订单页面。购物车不属于游客所能使用的功能,实现游客使用时自动跳转至登录页面。
[锚点] 4.3.6 前台订单功能概要设计提交订单功能设计上,用户在购物车点击“去结算”按钮跳转至核对订单页面,进入核对订单页面后;点击“提交订单”按钮跳转至订单提交成功页面,于此同时,购物车里的商品需要得到清空,相应的后台数据库也是,可以点击“去付款”按钮跳转支付页面。
[锚点] 4.3.7 前台支付功能概要设计前台支付功能设计上,使用支付宝开放平台沙箱环境下的支付宝在线支付体验,页面上通过提交订单功能后的“去付款”按钮跳转至支付页面。进行支付宝在线支付相关操作之后,设计页面跳转回平台首页,生成订单信息,未完成支付则保留订单一定时间后清除。
[锚点] 4.4 平台数据库设计本平台的数据库上选用的是Mysql数据库,分别在Window和Linux环境下搭载,一个为整个平台提供数据,一个为Solr索引库提供数据来源。数据库的设计上,严格遵守数据库的设计原则和规范,根据平台实际需求而设计,做到数据库的完整性约束,一致性约束,可扩展性和可修改性,借助Navicat可视化工具进行操作。
数据库E-R图:
图4-2 数据库E-R图
数据库表设计:
商品表
表4-1 t_goods
字段 数据类型 字段大小 约束 字段含义
goods_id mediumint 8 主键,非空 商品编号
cat_id int 11 非空 分类编号
goods_name varchar 120 非空 商品名称
click_count int 10 非空 点击次数
brand_id smallint 5 非空 品牌编号
store_count smallint 5 非空 库存数量
shop_price decimal 10 非空 商品价格
on_time int 10 非空 上架时间
goods_type smallint 5 非空 模型编号
spec_type smallint 5 非空 规格编号
商品分类表
表4-2 t_goods_category
字段 数据类型 字段大小 约束 字段含义
id smallint 5 主键,非空 分类编号
name varchar 90 非空 分类名称
level tinyint 1 默认空 分级
image varchar 512 默认空 分类图片
is_show tinyint 1 非空 是否显示
商品模型表
表4-3 t_goods_type
字段 数据类型 字段大小 约束 字段含义
id smallint 5 主键,非空 模型编号
name varchar 60 非空 模型名称
商品属性表
表4-4 t_goods_attribute
字段 数据类型 字段大小 约束 字段含义
attr_id int 11 主键,非空 属性编号
attr_name varchar 60 非空 属性名称
type_id smallint 5 非空 模型编号
type_name varchar 60 默认空 模型名称
商品规格表
表4-5 t_goods_spec
字段 数据类型 字段大小 约束 字段含义
spec_id int 11 主键,非空 规格编号
spec_name varchar 60 默认空 规格名称
type_id smallint 5 默认空 模型编号
type_name varchar 60 默认空 模型名称
订单表
表4-6 t_order
字段 数据类型 字段大小 约束 字段含义
order_id mediumint 8 主键,非空 订单编号
user_id mediumint 8 非空 用户编号
order_status tinyint 1 非空 订单状态
pay_status tinyint 1 非空 支付状态
consignee varchar 60 非空 收货人
goods_price decimal 10 非空 商品总价
pay_time int 10 非空 支付时间
total_amount decimal 10 非空 订单总价
订单项表
表4-7 t_order_goods
字段 数据类型 字段大小 约束 字段含义
rec_id mediumint 8 主键,非空 表编号
order_id mediumint 8 非空 用户编号
goods_id mediumint 8 非空 商品编号
goods_name varchar 120 非空 商品名称
goods_num smallint 5 非空 购物数量
goods_price decimal 10 非空 商品总价
spec_key varchar 128 非空 规格编号
spec_key_name varchar 128 非空 规格名称
用户表
表4-8 t_user
字段 数据类型 字段大小 约束 字段含义
user_id smallint 5 主键,非空 用户编号
user_name varchar 60 非空 用户名称
email varchar 60 非空 用户邮箱
password varchar 32 非空 用户密码
ec_salt varchar 50 非空 密钥
add_time int 11 非空 注册时间
[锚点] 5 电商平台详细设计与实现在第四章电商平台的概要设计基础上,在本章进一步描述电商平台的详细设计与实现,将从平台架构和功能两个角度进行剖析。
[锚点] 5.1 平台架构详细设计本平台的工程架构为Maven工程,ego-parent是整个工程的一个父工程,其中包括公共工具类系统ego-common,后台系统ego-manager,前台系统ego-portal,服务系统ego-rpc,订单系统ego-order和单点登录系统ego-sso,除了公共工具类系统每个子系统都拥有自己的pojo和mapper对象,也拥有service层和web层,共同组建成一个完整的平台工程,其中各个子系统的pojo和mapper是由Mybatis的逆向工程generator自动生成,包括pojo,mapper.xml,mapper.java,不需要手动编写,大大的提高了编程效率。
图5-1 平台工程架构图
平台的系统架构是在MVC模式的三层架构下,利用Dubbo服务治理框架和Zookeeper注册中心搭建服务系统。利用Nginx分别实现前后台系统的方向代理,前后台系统则通过Dubbo实现服务的远程调用。
Vsftpd文件上传服务器,安装在Linux环境下,是商品图片的存储地。
Redis服务器安装在Linux环境下,由一台主机和两台从机构成一个集群,配置了主备切换读写分离,用来存储一些临时数据或常用数据。
Solr搜索引擎安装在Linux环境下,为前台的搜索功能所服务,实现了前台的关键字搜索,做到了搜索的快速高效,Solr的索引库数据源于Linux环境下的Mysql数据库,由Solr自己整理而来。
图5-2 平台执行流程图