项目介绍功能实现 有用

面试官你好,我叫XXX,毕业于XXX大学,2013年8月进入XXX科技有限公司。在这两年中我总共做过三个项目,第一个是个给一家教育培训公司做信息管理系统,第二个是一个物流公司的项目。第三个就是最近做过的电商项目。我们这个项目采用了分布式的架构,使用maven进行项目依赖和jar包的管理,使用中间切分的方式将web,service,mapper,pojo分层开发,好处是让代码的重用性更高。整个项目技术用spring,springmvc,mybatis框架进行开发.


我们这个项目分为后台商品管理模块、会员模块、订单模块、购物车模块、支付模块、搜索模块、评论模块等。

我在这个项目中主要负责了后台商品管理模快:主要是实现了商品的录入、上下架、以及商品类目详情展示,包括商品规格参数模版设计以及商品实际规格参数录入功能。其中在商品查询过程中没有使用传统的mybatis分页查询而是使用一个分页插件PageHelper来实现。对于商品图片的上传,在后台页面使用了富文本编辑器KindEditor进行批量上传。后台使用fileupload组件来接收图片,在后台代码里面实现图片校验功能,图片校验包括:1.对图片的大小进行校验;2.对图片的格式进行校验;3.对文件的内容进行校验。防止危险脚本通过图片上传功能到服务器;文件内容的校验是通过ImageIO读取上传的文件构建BufferedImage对象,通过判断BufferedImage的宽和高属性来判别上传的文件是否为图片。关于数据库优化方面,商品表中价格字段使用long型存储,避免了开发中处理小数的问题。商品描述作为表格单独设计,因为数据量比较大,而且描述一般不轻易改动单独作为一个表查询商品的时候不需要查询,提高了查询性能。用户需要的时候让其查询。而对于商品规格参数的设计考虑到一个商品对应一张表,存放该商品的规格参数数据,数据表太庞大,于是组内商讨设计了一张商品规格参数的模版表该表中有六个字段,分别是ID、创建时间、更新时间、商品类目ID、商品类目名称、规格参数模板数据。每一个类目对应模板表的一条记录,规格参数模板数据存放的是商品类目的规格参数。新增商品时,根据模版生成一个规格参数的表单,填写规格参数数据,保存到数据库中。


在前台系统中我实现了商品分类的展示,实现商品分类展示我们有两种思路,第一种就是当前台系统的页面需要展示需要商品分类信息的时候,前台页面前台系统Ajax请求,由前台系统通过HttpClient访问后台系统获取商品分类信息,然后前台系统将商品分类信息数据响应给前台页面。

第二种实现方案是前台页面直接发送ajax请求访问后台系统。因为后台系统向前台页面发送的是json格式的数据,而json数据无法进行跨域传送,所以我们使用了jsonp来包装json数据,实现跨域数据的传输。这种实现方案性能稍高于第一种,最后我采用的就是这用设计思路。

由于商品首页分类展示的操作很频繁,为了减轻数据库的压力,我们使用了redis作为缓存数据库。后台系统在查询MySQL数据库之前,先查看redis里面是否有商品分类信息,如果有则直接返回结果,如果没有则查询MySQL数据库,将查询结果保存在redis中并返回该结果。


我们的项目中关于用户登录的这一块采用的是单点登录系统,考虑到一般用户登录的时候,当用户登录成功以后,我们将用户信息保存在session中,因为这个我们采用的是分布式架构,当用户要访问其他的功能模块的时候,由于session是基于web服务器的(session是存在于一次回话 所以不能跨服务器)每一个功能模块都有一个自己的web服务器各个功能模块不能共享session数据,所以用户需要重新登录。我们采用了单点登录系统。当用户登录成功后,我们根据时间戳用户id生成唯一的令牌ticket,将ticket和用户信息作为键值对存放在redis中,并把ticket写入cookie中,当用户访问其他功能模块的时候,首先从cookie中拿到ticket,根据ticket在redis里面查找用户信息,如果找到则登录成功


在首页的商品搜索模块中我们使用了solr实现,我们提供服务从数据库中查询的数据生成索引库。为了实现各模块数据之间的同步,我们在搜索模块提 供了服务接口。只要后台系统数据有增加,删除,修改调用搜索模块的服务进行索引库的维护。(搜索这一块是其他人做的,他们提供了一个接口,通过这个接 口调用搜索模块的服务进行维护。)


我们使用RabbitMQ实现商品数据的同步。为了减轻数据库的压力,提高系统性能我们引入了redis缓存数据库和solr索引库,这样就会涉及一个数据同步的问题。我们要保证MySQL数据库、redis缓存数据库以及索引库中商品的数据是一致的,原先我们是这么做的:当后台系统商品的数据进行增加,删除,修改的操作后,通过httpClient调用前台系统和搜索系统对redis和索引库中的数据进行维护。这样虽然能解决数据同步的问题,但是各个模块之间的耦合性太高,当新增加某个系统以后,要对后台系统进行维护,这显然是不合理的,所以我们引入了RabbitMQ。后台管理系统作为消息的生产者,需要发送消息,在后台系统声明交换机,确定交换机的类型topic前端系统和搜索系统都是消息的消费者,在前端系统和搜索系统端声明队列,并监听队列消息,根据消息内容做出相应的操作。


购物车的实现有多种方式,可以直接使用数据库存储购买的商品信息,可以使用session来作为购物车存储商品。用数据库来存储商品对数据库造成的负担特别大,而且对于购物车这种需要实时操作的东西,数据库的访问量一旦太大,数据库容易出现并发错误,或者直接崩溃。用session来存储商品信息效率确实很高, 而且会话是针对各个连接的, 所以便于管理, 但是用session也不是完美的, 因为session是有有效期的, 根据服务器的设置不同而不一样长, 如果你在购物的过程中session超时了, 那么购物车中的东西就会全没了;session是保存在服务器内存中的,占用了服务器资源。session无法进行水平扩展,使用集群。基于这些考虑,我们使用cookie+MySQL来实现购物车功能。当用户处于登录状态的时候,我们将购物车信息存放在MySQL数据库中;当用户处于未登录状态,我们将购物车信息保存在cookie中,用户进行登录操作的时候,判断cookie中是否有购物车信息,如果有,则把购物车信息与数据库中的合并。因为我们使用了数据库作为购物车来存放商品数据,考虑到数据库的压力大,我们采用了数据库的集群搭建实现数据的读写分离。我们设计了一个主库负责写入数据,三个从库读取数据,这样就大大减轻了数据库的压力。

 

订单系统,购物车系统


在首页的商品搜索模块中我们使用了solr实现,我们提供服务从数据库中查询的数据生成索引库。为了实现与数据库之间的同步,我们在搜索快提供了服务接口。只要数据有增加,删除,修改就调用对应的服务。再之后我就实现了商品详情页的展示,首先根据商品的id到redis缓存中命中,如果缓存中没有才会查询数据库,并且保存到redis中,考虑到redis是内存稀缺资源。所以我们在设计的时候为不需要经常显示的提供了在redis中的有效时间。我们设计的是一天。在商品详情页中首先将关键字段查询展示,在使用延迟的方法加载商品描述,提高了相应的速度。并且商品规格我们使用按需加载,只有点击才会加载。较轻数据库压力。

由于顾客要创建订单需要登录,但是我们采用的分布式架构,为了提高顾客的体验性。所以我们采用了单点登录系统。

posted @ 2018-08-02 23:09  阿善9  阅读(939)  评论(0编辑  收藏  举报