经历了几个周写的易买网项目终于告一段落,我也切实感受到代码之路真的需要披荆斩棘、学无止境,我所懂得东西真的是太少太少。而项目过后,回想起来,真的是收获良多。
对于这种简单的电商网站,不需要特别多的思维逻辑,但是把所学东西实际化,还是有一点难度,下面我一一将难点和知识点剖析解决:
一、三级导航
三级导航算是本项目的第一个难点,一般写首页的都会首先触及它。而什么是三级导航呢?顾名思义,就是分为三层的导航栏,但是呢,其中层层之间有着不可遮掩的关系,一级导航下对应着只属于它的二级导航,二级导航下对应着只属于它的三级导航,而数据库里这些导航分类都在一张数据表里,只是用不同的type来区分并且用parentid来进行相邻两级,那怎样使后台一张表的数据在前台显示为分层数据呢,这里我运用了递归思想进行处理:
//首先创建实体类,在种类的实体类中加入一个字段:当前种类的泛型集合,用来存储当前种类对象的子集集合
//得到一个带有层次的一级导航集合,调用时,传值getNav(0,1)
public List<product_type> getNav(int parentid, int type) throws Exception { //创建一个存储当前分类的集合 List<product_type> lists = new ArrayList<product_type>(); //这条sql能根据不同的parentid和type查出所有的种类 String sql = "SELECT * FROM easybuy_product_category WHERE parentid=? AND TYPE=?"; //得到对应的结果集 ResultSet rs = this.executeQuery(sql, parentid, type);
//遍历结果集,创建对象给对象一一赋值 while (rs.next()) { product_type prdType = new product_type(); prdType.setId(rs.getInt("id")); prdType.setName(rs.getString("name")); prdType.setParentId(rs.getInt("parentId")); prdType.setType(rs.getInt("type")); //type值无非1,2,3这三种值,明确递归的终止条件 if (type < 3) { type++; List<product_type> nav = getNav(prdType.getId(), type);//通过再次调用当前方法,便可以查出当前对象下的子集种类集合 prdType.setChirdren(nav);//将集合赋给当前对象的属性 }
//用来解决其他对象递归时,type值已经大于3,其他对象无法查询对应子集的问题 if (type == 3) { type = 2; } else if (type == 2) { type = 1; } lists.add(prdType); } return lists; }
递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
效果图:
二、购物车创作思路
购物车板块主要分为两部分,第一部分是往购物车里添加商品,第二部分是购物车对象的区分与传递。按照老思想来说,给数据库建一张购物车表,用id进行区分,未登录状态下得购物车可以放到cookie中,这虽然是可行的,但是呢,登录状态下购物车的数据如果直接放在数据库里,频繁的操作,会对数据库产生不小的压力,所以在这里我采取了redis缓存技术。
思路设计:
1.首先我们需要创建一个购物车实体类,里面需要两个字段,一是id,二是商品的泛型集合,用来存储商品集。需要注意的是购物车类和商品类需要实现序列化接口,以保证redis缓存的实现
public class shoppingC