我们这个项目是基于SOA的架构来实现的。采用的是dubbo中间件来实现表现层跟服务层之间的通信。我们项目分为前台后台,前台提供内容展示,商品展示,商品搜索,购物车,订单等模块,支付,客服中心等模块,后台提供管理商品,内容管理,订单管理,采购财务管理等模块。
下面我给您具体介绍一下。
首先进入我们的网站首页:最上面是我们的网站的logo,搜索框,下面左边是测分类栏对商品进行分类,轮中间是轮播图广告位,跟着下面是新闻公告栏,再下面是一些热门商品的展示。这上面内容都是动态的展示出来的,所以我们要有一个后台来管理这些内容。
我介绍下我参与的两个模块:
后台模块还有商品管理模块,这一块是对商品的列表展示,以及增删改查操作,分页采用的是pagehelp插件,将商品信息查询出来的信息放到pageinfo对象里面,设置分页信息,返回数据给datagrid;新增商品的话,在商品添加界面录入商品信息,商品的id,商品标题,商品卖点,商品价格,库存数量,商品条形码,商品图片,商品类别,商品状态(1-正常,2-下架,3-删除'),创建时间,更新时间,商品的描述。其中图片存储考虑到数量比较多,采用的是分布式文件存储系统(fastdfs),图片多了可以搭建集群。商品的描述采用的是富文本编辑器,将录入的商品信息分别插入对应的不同的表.
然后我们再来说下首页的其他部分,最上面有个搜索框,当用户在首页没有看到想要的商品时,可以有针对性的进行搜索,使用了solr技术,根据IK分词器,对查询的条件进行查询,首先创建一个SolrQuery对象作为商品搜索的查询条件,设置分页条件,指定默认的搜索域,设置高亮,执行查询,计算出总页数和总条数,返回一个QueryResponse结果集,在将结果集循环遍历添加到自己定义的集合里面,返回给页面,一个商品的图片有多个地址,需要将图片的地址分切转化成数组,页面显示的时候取数组的下标为0,取出一张图片就可以了,这样我们就搜索到我们想要的一些商品。
这里有一个问题就是索引库要同步,当我们添加商品的时候,我们使用了一个消息中间件ActiveMQ来同步索引库,添加商品时,发送消息。在搜索模块中,创建MessageListener接口的实现类接收消息,取商品id,根据商品id查询数据库,创建一SolrInputDocument对象,使用SolrServer对象写入索引库。
当用户搜索到自己想要的商品时,就会去点击那个商品图片或者名称进入商品详情页面。商品详情展示要查两个表,一个是商品表,一个是商品描述表,当访问量很大时,如热门商品,就会频繁的跟数据库交互,为了减轻数据库的压力,考虑使用缓存。热门商品访问量比较大,需要做缓存,普通商品却需求不大。要区别对待,我们考虑到使用记录访问量来记录访问次数,来区别热门商品,针对的做缓存,但这样操作麻烦。最终我们采用设置redis过期时间来处理这个问题, 热门商品访问比较深多,过期了又会存进去。
不过我们为了进一步减少数据库的压力,商品详情页采用了FreeMarker模板引擎技术,生成一个静态化页面。这样能减轻服务器的压力。当我们添加商品的时候,我们使用了一个消息中间件ActiveMQ发送消息。再创建MessageListener接口的实现类接收消息,取商品id。
根据商品id查询数据库,过得商品基本信息和商品描述,创建商品详情模板,指定下商品输出文件路径,生成静态文件,用nginx作为http服务器来访问静态页面。如果一台服务器不够,可以采用分布式扩容,我们还可以使用nginx来反向代理,负载均衡。
最后我讲一下订单模块,购物车完成后要生成订单,订单中有配送信息,因此我们必须要求用户登录。我们使用的是单点登录,使用redis模拟Session,实现Session的统一管理,这样用户只需要登录一次就可以访问所有相互信任的应用。用户登录成功后,生成token,相当key, 把用户对象转换成json当value存入redis,模拟Session的过期时间。一般半个小时。最后把token写入cookie中(Cookie需要跨域)。
当点击生成订单时,先配置一个springmvc的拦截器,实现接口HandlerInterceptor,从cookie中取token,没有token,需要跳转到登录页面;有token,调用sso系统的服务,根据token查询用户信息,如果查不到用户信息,说明用户登录已经过期。需要跳转到登录页面,查询到用户信息,放行。
放行后,提交购物车OrderInfo,接收表单的数据,不全一些数据,生成订单id,向订单表插入数据。向订单明细表插入数据,向订单物流表插入数据。返回逻辑视图展示订单生成成功。在调用第三方接口,完成订单支付。
需要了解更多的学习资源可以加QQ 2832281573 领取