电商项⽬java经验_分布式电商系统项⽬总结
概述:
淘淘商城是采⽤分布式架构部署的⼀个⼤型⽹上商城系统,类似于京东商城。本系统分前台系统和后台系统。前台系统主要负责商城的页⾯的显⽰功能,这⾥采⽤的⾯向服务的⽅式,pc端⼿机端只负责显⽰页⾯,业务逻辑都在服务层实现,客户端调⽤服务端接⼝来实现显⽰功能。
在前台系统中主要分为:客户端:系统前台页⾯显⽰系统(portal,8082)。服务端系统:(1)rest系统(8081):负责调⽤CMS系统的内容,将CMS系统的内容显⽰到页⾯,(这⾥的CMS内容管理系统,在后台实现)。(2)商品的搜索系统(8083),当在页⾯输⼊商品信息时,可以搜索商品。这⾥⽤到了solr技术,利⽤solr索引库来实现。(3)SSO(单点登陆系统,8084),因为商城采⽤分布式的系统部署,将整个系统划分为⼏个⼦系统,所以对于⽤户的访问权限是⼀个问题,如何实现⼀次登陆即其他系统都可以免登陆,sso可以解决。(4)订单系统(8085):商城购物少不了订单系统,所以将此作为⼀个独⽴⼯程编写。
后台系统功能:商城的后台系统主要是负责商品的分类,添加、规格参数。CMS系统(这⾥主要是⼴告的分类、添加)。
本系统前台界⾯设计采⽤的easyUI的设计,后台采⽤springMVC、spring、mybatis框架,擦⽤java语⾔编程。
步骤分析:
⼀、项⽬需求分析:模仿京东商城系统。
⼆、项⽬数据库设计:商品信息表、商品信息分类表、商品信息描述表、商品规格参数表、
CMS系统内容表、CMS系统内容分类表
⽤户表、订单表、订单的具体明细表
三、具体实现:
1、框架的搭建:
这⾥采⽤maven来管理整个项⽬。优势两点:1、maven可以以管理整个项⽬⼯程,⽅便热部署项⽬,项⽬发布⽅便。2、maven管理你jar包具有很⼤的优势,可以⾃动下载所需的jar包,只需定义好版本即可,其他maven⾃动下载。
因为这个项⽬⽐较⼤,⼦⼯程⽐较多,所以我们建⽴⼀个pom类型(聚合⼯程)parent来管理⾥所有jar包的版本,这样其他 ⼦⼯程都依赖此⼯程。版本得到了统⼀,不会出现因版本问题导致的错误。其次建
⽴⼀个专门的(jar类型)common⼯具类,可以将系统中使⽤到的⼯具类都加⼊此类,其他类也依赖此类,就可以使⽤这⾥⾯的⼯具了。此⼯具类也依赖parent类。
下⾯就是利⽤SSM框架来搭建⼯程了:利⽤框架搭建⼯程主要分两步:框架所依赖的jar包,框架的配置⽂件。弄清了这两点就好办了。框架主要分三层:dao层(mybatis)(主要是与数据库打交道)、service层(spring)(主要是负责调⽤dao层,实现业务逻辑的编写)、controller 层(springMVC)(这⾥主要调⽤service层,根据jsp页⾯的内容,将jsp的内容传递到service层,然后讲数据显⽰到jsp页⾯)。所以这⾥的配置⽂件也就:mybatis的l (主要是它的插件配置,数据库配置放在dao)。spring将mybatis和springMVC整合起来的application_l(配置数据源,与数据库的连接),application_l(将service的⽂件包引⼊⼯程)。application_l(这⾥将事务独⽴出来,主要是事务的配置)
框架搭建完成后,利⽤mybatis的逆向⼯程⽣成各个表的l和mapper.java⽂件、pojo⽂件。
json值的类型有哪些
2、具体的功能的实现逻辑
(1)后台系统功能实现
(这⾥主要讲商品的查询、添加、规格参数、CMS系统的分类、添加)
其实对于功能模块的分析主要有三点:
从哪个数据表获取(主要mapper实现);页⾯传递是否有参数,页⾯的url是什么(controller实现);返回值是什么(即页⾯展⽰的格式是什么样⼦的,这个根据jsp使⽤的框架来决定,⽐如这⾥的easyUI,可以查询它的api⽂档,到其返回值类型);
A、商品的查询逻辑分析:其实对于商品的查询主要就是从数据库中将所有商品查询出来。这简单的查询很简单,可是在页⾯分页显⽰出来这就是⼀个问题了。这⾥到了mybatis的分页插件pageHelper来实现。
传⼊参数:Easyui页⾯默认有page、rows参数传递。
返回值:easyui的格式即datagrid的格式,专门编写⼀个对应的pojo类放⼊专门⼯具类中使⽤,返回格式即这个pojo。
逻辑:Dao层:Dao层⽤mybatis的逆向⼯程
Service调⽤mapper的查询和分页实现逻辑。
Controller即将参数传递过去,url写好
B、商品添加:商品添加即将商品信息写⼊数据库,页⾯传递的内容当点击提交按钮时直接写⼊数据库,只需补全没有的字段即可。
这⾥涉及到商品的类⽬选择、上⾯的图⽚上传、商品的描述信息。
类⽬选择⾸先得将类⽬展⽰出来,这⾥使⽤的异步树的格式。查询api发现异步树的返回值的格式。主要思路是:根据parentId来查询类⽬表,默认从0开始,异步树有个特点,就是每次获取到的id,如果有⼦节点,会发送url再次请求,如果没有⼦节点则不发送请求,所以可以都遍历到所有节点。(这个是tree的特点,⾃动请求)
异步树的特点:从最顶层开始读取,先读顶层节点,如果是闭合状态,发送请求给服务器读取⼦节点,⼦节点的状态依赖于⽗节点,当展开⼀个封闭的节点时,如果节点没有加载⼦节点,它将会把节点的id的值作为http请求参数并命名为id,通过url发送到服务器上检索⼦节点。所以遍历⼀次后,如果⽗节点还是⽗节点(即存在⼦节点)则检索下⾯的⼦节点的内容,将⼦节点的id作为parentId来检索下⾯的节点。如果不是⽗节点了,则打开下⾯列表。也就是说这些实现都是 异步树⾃动实现的,我们只需要判断⽗节点的状态即可,下⾯的检索根据这个状态进⾏。
图⽚上传功能:因为商城的图⽚⾮常多,所以我们将这么多的图⽚保存在图⽚服务器中,然后将图⽚在服务器中的具体url写⼊数据库,供前台调⽤。前台获取到这个url既可获取到这个图⽚。这⾥图⽚上传到服务器的功能:先⽣存图⽚的名称,然后⽣成图⽚保存的格式,然后利⽤ftpUtil将图⽚上传到服务器,返回⼀个url链接。
商品规格参数,这⾥采⽤的规格参数模板的形式。:
这⾥有两个表:⼀个模板表(根据商品的分类建⽴的模板,根据分类id),⼀个展⽰模板表(根据商品的信息写⼊模板表,根据商品id查询商品信息,然后写⼊对应订单模板中,然后⽣成HTML)。
商品的描述:这⾥采⽤⽂本的形式存储的,写⼊即可。富⽂本编辑器。
CMS分类:这⾥的格式也是⽤了异步树的格式,所以显⽰⽅法是⼀样的。
分类添加:像表中插⼊数据库即可。
(2)前台功能实现
⾸页⼤⼴告位的实现:这⾥是从CMS系统中获取⼴告位的图⽚,然后展⽰在页⾯。但是前台跟后台是不⼀样的端⼝,如何从前台访问后台呢,可以使⽤jsonp的形式。但是我们这⾥系统是采⽤⾯向服务的编程,所以采⽤rest接⼝的⽅式然后功能前台调⽤,这⾥⽤的httpcliet来调⽤接⼝。
商品搜索功能的实现:
⾸先在linux下部署好solr服务器,然后将数据库的表字段导⼊到solr索引库。然后编写search服务接⼝,然后供前台调⽤这个服务接⼝。
Rest功能:
商品详情页⾯展⽰:写三个服务:根据id查询商品的具体信息显⽰到页⾯,根据id查询商品的内容表,根据id查询商品的规格参数,即将三个信息展⽰到页⾯。然后前台分别调⽤。
SSO系统:这⾥涉及到。
这⾥是利⽤了sso的接⼝⽂档,即校验接⼝、注册、登录接⼝、根据token查询⽤户接⼝、安全退出接⼝。
这个的调⽤服务层是利⽤jsonp的形式访问的服务接⼝,实现跨域访问。客户端全部在jsp页⾯实现的。
具体流程:
当⽤户点击注册的时候,跳转到注册页⾯,即⽤户信息的保存功能。检验⽤户名是否存在、⼿机号和邮箱不能为空。
当⽤户点击登录按钮的时候,⽤户输⼊⽤户名和密码,检验⽤户名是否在数据库中存在,然后⽤户名密码是否正确。这⾥的密码是⽤了spring的MD5加密技术。当全部成功后,给⽤户颁发⼀个token令牌(利⽤uuid实现),然后将token存⼊到redis中(token的key是它⽣成的号,值是⽤户的名字),然后设置在redis的过期时间。这相当于⽤户的session。
然后将token写⼊cookie中,前台页⾯利⽤jsonp调⽤,根据cookie中的token的值,调⽤sso的根据token查询⽤户的服务,查看⽤户是否有效,如果有效则将⽤户返回前台页⾯,前台页⾯获取⽤户的⽤户名显⽰在⾸页,表⽰***已登陆。
这⾥的cookie是设置了共享域,即全部⼦系统都可以访问到cookie。
当⽤户登录其他⼦系统时,先从从cookie中获取token信息,根据token信息获取⽤户信息,判断⽤户信息是否有效,如果有效则放⾏,如果⽆效,则利⽤拦截跳转到登录页⾯。⽤户再次登录的时候刷新redis的时间,重新设置有效期。
的拦截,在l中设置拦截的名称。
购物车功能:
购物车功能注意到这⾥商品加⼊购物车,是将购物车保存在cookie中。这⾥⽤到cookieUtil⼯具来实现
这些保存删除功能。在商品详情页⾯点击“加⼊购物车”按钮提交⼀个请求吧商品id传递给Controller,Controller接收id,Controller调⽤Service根据商品id查询商品基本信息,购物车的商品专门写⼀个pojo对象,因为商品的很多信息购物车⾥⾯⽤不到。将购物车的商品的pojo,把商品写⼊cookie中,加⼊cookie之前先从cookie中把购物车的商品取出来判断当前购物车商品列表中是否有此商品,如果有数量加⼀,如果没有添加⼀个商品,数量为1。展⽰给⽤户购物车列表。
订单系统:订单系统主要是订单的创建、查询、修改、删除功能。
订单系统因为pc端和移动端都需要调⽤此功能模块,所以将订单系统也单独作为⼀个服务接⼝供客户端调⽤。
订单服务接⼝也有接⼝⽂档,根据⽂档进⾏订单的创建。
订单的创建需要⽤户登录,这⾥⽤到了在springMVC中配置下拦截⽅式即可。
当⽤户拦截成功后,⽤户登录该商城,这时候注意将⽤户保存在request中,⽬的是因为查询订单的时候需要根据⽤户的id来查询,不同的⽤户具有不同的订单啊。
然后⽤request的get和setAttribute来获取值和设定值。为什么可以从request中取,因为我们整个商城都是http协议访问的。
(1)订单创建逻辑:
当点击去去购物车结算时,显⽰购物车的列表,当选中购物车的商品点击去结算的时候,显⽰商品的提交订单之前的⼀系列信息(也就是结算页):针对数据库三张表:订单基本信息表、订单明细表(购买的商品信息)、订单配送(收货⼈的信息)
传⼊参数:因为创建订单也就是向数据库中插⼊⼀系列的信息,⽽对应的是数据库中的三个表,所以根据页⾯的内容,传⼊的参数也就是三个pojo类,然后页⾯填写的+补全页⾯上在数据库中没有的字段。所以主要是对数据库中的三个表进⾏插⼊操作。服务接⼝是负责接收这三个pojo类,所以客户端要想办法将这三个pojo类传递过来。
根据接⼝⽂档,返回的是⼀个json格式的数据,即这三张表的数据是在⼀个json串中,所以这⾥要想办法将这三个表单独建⽴⼀个pojo来保存这个返回值。
接收的pojo类:
这⾥采⽤了这种⽅式巧妙的将三个表合并起来了。
接下来就是数据的插⼊操作了,这个在service层实现:逐个表的插⼊数据库即可,然后返回⼀个订单号即订单的id。
controller层传递的就是这个pojo类,然后返回给客户端。
客户端也是将这个pojo类传递给服务接⼝,返回⼀个订单号给客户端。提交订单的时候显⽰订单提交成功页⾯时候,看下jsp页⾯显⽰哪些字段,然后⽤model传递给页⾯。
(2)订单的分页查询:
前⾯我们将⽤户保存在了request中,然后获取到⽤户的id,根据⽤户的id来查询订单,前台页⾯默认传递page和rows,利⽤mybatis的分页查询来查询订单即可。
传⼊参数:page和rows
执⾏操作:根据⽤户id查询订单,根据page和rows分页
返回值:订单的列表信息,即⽤户的多个订单信息。根据接⼝⽂档,我们发现这个返回的信息就是数据中订单表的部分信息,所以⽤⼏个字段组成⼀个新的pojo来接收返回值。
(3)根据订单id查询订单:
根据订单id查询订单这个显⽰的信息就⽐较全⾯了,这个返回值跟之前的三个数据库的表对应,所以根据id,分别查询这三个表,来获取对应的信息。
传⼊参数:订单id
操作:三个表分别查询
返回值:之前新定义的三个表的Order的pojo类。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。