条件过滤查询(搜索)

过滤条件功能分析:

怎么回事小老弟,还不去敲代码

一.分类\品牌\规格的过滤

1.功能要求:在我们的搜索页中,当我们输入一个关键字,相关商品的属性(品牌,分类,规格等等)就会出现在下面.我们要做的就是根据商品的这些属性来就行筛选.要达到的效果是:我们点击品牌\分类\规格,这些筛选条件会出现在面包屑中,同时相关属性的选择框会消失,通过一步步的筛选就能得到想要的商品

2.业务思考:怎么做这个功能呢

前台搜索条件的构建

①:首先我们要把商品分类\品牌\规格以map的形式放入一个集合中,方便我们做面包屑时使用,需要注意的一点是,我们的规格是一个集合(因为有子规格);所以我们在进行具体的业务之前需要先定义出来这个集合:{'关键字':'','商品分类':'','品牌':'','规格':{}}

②:下一步就是增加搜索选项了,我们之前有一个搜索的Map集合是searchMap,我们现在要做的就是往这个集合中添加元素;由于商品分类和品牌列表是一样的,但是规格是不一样的,规格是集合的形式,所以在这里就要进行了一个判断---->我们定一个addSearchResult的方法,这个方法的参数是key和Value,也就是要添加的属性和属性值;我们再进行判断,如果key是商品分类或者品牌,我们就直接在searchMap(之前的搜索条件集合)中添加就行了;如果key是规格,我们就要再点上规格在进行添加;我们在这还要添加ng-if,为的是我们在查询时如果没有多余的属性,就不要显示,所以加了ng-if判断返回结果中所属属性的集合是不是空的,空的就不显示

③然后在页面上的商品分类\品牌\规格标签上分别绑定上方法,里面放入的是属性(比如分类就是category)和值,然后可以在面包屑的位置写上searchMap集合进行测试

④:接着就是处理面包屑了,在这里有一点要注意:就是我们的分类和品牌这两个属性是写死的,当我们没有点击分类或者品牌时,面包屑中是不能显示的(由于规格不能写死所以不用处理);我们采取的措施是用ng-if标签判断一下我们要处理的选项的集合是不是空的,只有不是空的才让它显示

⑤:我们可以添加搜索条件,那么我们也应该可以撤除搜索条件,就是我们可以移除面包屑中的搜索条件,换句话说就是我们可以有一个方法可以从searchMap集合中移除元素就行了,参照add方法再controller中增加移除方法,然后在页面找那个的搜索条件位置调用方法就行了

⑥:接下来就是隐藏查询面板的功能:这个功能是我们选择完一个选项后,就应该让这个选项框消失,想要达到这个效果也很容易,就是再在ng-if标签的后面再加一个判断就行了,但是这个判断是什么呢?我们想什么时候才让这个选择面板显示呢?就是搜索条件的集合里对应的属性没有值的时候就让它显示,一旦有值就表示用户已经点击了对应的选项,就可以隐藏了;注意:这和之前的根据查询结果隐藏面板的条件是&&的关系,需要写在一起;还要就是规格的判断时,让规格的对应选项为null,而分类和品牌的属性就要让对应的='',因为分类和品牌没有时是有占位符的

⑦:既然我们在前台添加或者删除了搜索条件,那么就应该执行响应的方法,再js的controller中添加或者移除添加时,要执行搜索方法,重新进行刷新搜索

后台过滤查询

①:我们在前台建立了搜索项,那么最终的过滤业务还是后台来执行;怎么执行这个业务逻辑呢?其实和关键字查询差不多,在关键字查询的后面再加上每个选项的判断就行了,在这个业务中主要是用SimpleFilterQuery这个类的对象进行条件过滤

②:我们添加了过滤条件后,就要在查询方法中修改查询品牌和规格列表,不过在真正执行业务之前,需要进行判断,先判断从搜索条件中获取的分类选项是不是空的,如果有值,就按这个分类选项进行查询;如果是空的就要从上面按照关键字查询的商品分类集合中的值进行查询,当然在这里面也要进行判断,只有这个集合的长度大于0时(有值时),才进行查询

二. 价格区间的过滤

1.功能要求: 我们这个价格区间的搜索呢也很常见,就是前台页面上,有多个价格区间,比如0-500,500-1000,1000-2000,....我们点击这些区间,就会增加搜索条件来帮我们进行商品的筛选

2.业务思考:

前台条件的构建:

这个功能和前面的分类品牌差不多,前台要做的就是把用户选中的价格区间传到后台,这里页面上的操作就不多叙述,注意就是:面包屑上不要忘了加上价格这个选项;还有就是js中的controller的搜索条件的集合中加上价格,增加和删除条件中也要加上价格这个选项

后台的业务逻辑

后台的和前面的逻辑也差不太多,就是我们要用一个数组来接收我们传进来的几个区间的最小价格和最大价格,用的是一个api,就是split("-"),返回的数组中,0号元素是最小值,1号元素是最大值;这个价格的过滤就复杂在下面:我们要在这进行两个判断,一个是看看最小结果是不是0,是0就不用进行下面的逻辑(其实就是为了做出0<**<=500而不影响其他几个区间判断的效果),如果不等于0,就加上过滤条件:大于最小价格;同理,对于最大价格也是这样操作,因为我们最后的区间是3000-*,后面是没有限制的,所以判断最大价格是不是*就可以了,是*不进行操作,让它只大于等于最小价格好了

你可能感兴趣的:(条件过滤查询(搜索))