面试的时候如何进行项目讲解?
(本文稿由就业部陈老师提供)
我们这个项目是基于SOA的架构来实现的。采用的是dubbo中间件来实现表现层跟服务层之间的通信。我们项目分为前台后台,前台提供内容展示,商品展示,商品搜索,购物车,订单等模块,支付,客服中心等模块,后台提供管理商品,内容管理,订单管理,采购财务管理等模块。 首先进入我们的网站首页:最上面是我们的网站的logo,搜索框,下面左边是测分类栏对商品进行分类,轮中间是轮播图广告位,跟着下面是新闻公告栏,再下面是一些热门商品的展示。这上面内容都是动态的展示出来的,所以我们要有一个后台来管理这些内容。 比如说广告位的展示吧,我们后台要管理这些内容,在后台页面最左边就会有一个网站内容管理模块,内容模块包含内容分类管理,内容管理。当我们点击内容分类,在右边就会显示所有商品的一个分类,在点击子节点,比如说我们这里的广告位,就会异步加载数据的显示查出广告内容。我们再在这个基础上对广告进行增删改查。考虑高并发量,为了避免频繁的与数据库交互,我们将数据存在了redis中,当在首页中点击广告时,我们将不再直接去数据库中查找数据,而是先判断缓存中是否有数据,如果有直接返回数据,如果没有就去查数据库并将数据缓存在radis中,另外我们修改内容后,会将原来的缓存删除掉,来同步数据库。
后台模块还有商品管理模块,这一块是对商品的列表展示,以及增删改查操作,分页采用的是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来反向代理,负载均衡。 我再讲下购物车模块,当客户查看商品详情后,想购买了,就会加入购物车。为了减少用户流失量,在不登陆的情况下,可以把购物车信息写入cookie,这样用户体验好。读写cookie我们封装了CookieUtils工具类来实现。加入时先判断商品id在商品列表中是否存在。如果存在,商品数量相加。不存在,根据商品id查询商品信息,把商品添加到购车列表,把购车商品列表写入cookie。购物车列表转换成json数据。需要对数据进行编码。Cookie的有效期:保存7天。展示购物车列表时,从cookie中取商品列表把,商品列表传递给页面。修改商品数量时,页面发送一个异步请求,后台接收两个参数商品id和数量,再从cookie中取商品列表,遍历商品列表找到对应商品,更新商品数量,把商品列表写入cookie。这里有个问题时,数量有上线,当库存不足时,我们是在提交订单时,去查询数据库,当库存不足时,给用户提醒。 最后我讲一下订单模块,购物车完成后要生成订单,订单中有配送信息,因此我们必须要求用户登录。我们使用的是单点登录,使用redis模拟Session,实现Session的统一管理,这样用户只需要登录一次就可以访问所有相互信任的应用。用户登录成功后,生成token,相当key, 把用户对象转换成json当value存入redis,模拟Session的过期时间。一般半个小时。最后把token写入cookie中(Cookie需要跨域)。 当点击生成订单时,先配置一个springmvc的拦截器,实现接口HandlerInterceptor,从cookie中取token,没有token,需要跳转到登录页面;有token,调用sso系统的服务,根据token查询用户信息,如果查不到用户信息,说明用户登录已经过期。需要跳转到登录页面,查询到用户信息,放行。 放行后,提交购物车OrderInfo,接收表单的数据,不全一些数据,生成订单id,向订单表插入数据。向订单明细表插入数据,向订单物流表插入数据。返回逻辑视图展示订单生成成功。在调用第三方接口,完成订单支付。 |