1. 搜索结果分页
1.1 后端分页
要实现分页,首先需要知道当前页pageNo和每页显示多少条数据pageSize
所以,代码如下:
// 1.6 分页
Integer pageNo = (Integer) searchMap.get("pageNo");
Integer pageSize = (Integer) searchMap.get("pageSize");
if(null == pageNo){
pageNo = 1;
}
if(null == pageSize){
pageSize = 30;
}
query.setOffset((pageNo-1)*pageSize); // 设置起始索引
query.setRows(pageSize); // 设置每页记录数
末了,要设置分页数据给前端,如图:
1.2 前端
1.2.1 构建分页栏
// 构建分页栏
function buildPageLabel(){
$scope.pageLabel=[];//新增分页栏属性
var firstPage = 1;
var lastPage = $scope.resultMap.totalPages;
if($scope.resultMap.totalPages > 5){ // 如果总页数大于5
if($scope.searchMap.pageNo <= 3){ // 如果当前页 <= 3 显示前5页
lastPage = 5
} else if($scope.searchMap.pageNo >= $scope.resultMap.totalPages-2){ // 如果当前页 >= 后两页 显示后5页
firstPage = $scope.resultMap.totalPages - 4;
} else {
firstPage = $scope.searchMap.pageNo - 2 ;
lastPage = $scope.searchMap.pageNo + 2 ;
}
}
//循环产生页码标签
for(var i = firstPage ; i <= lastPage ; i++){
$scope.pageLabel.push(i);
}
}
在search方法中调用;
1.2.2 构建分页查询方法
// 分页查询
$scope.queryPage = function(page) {
if(page < 1 || page > $scope.resultMap.totalPages){
return;
}
$scope.searchMap.pageNo = page;
$scope.search();
}
页面绑定变量即可
2. 排序
2.1 排序后端
2.2 前端
js方法定义:
$scope.sortSearch = function(sort,sortField) {
$scope.searchMap.sort = sort;
$scope.searchMap.sortField = sortField;
// 执行查询
$scope.search();
}
2.2.1 价格排序
2.2.2 新品排序
新品排序其实就是按照上架时间降序排序
1)在solor定义一个上架时间域
<field name="item_updateTime" type="date" indexed="true" stored="true" />
2)给TBItem实体类的updateTime字段添加注解
@Field("item_updateTime")
private Date updateTime;
3)执行solrUtil导入数据到solor
进入solr管理台,看字段值是否成功导入,如图:
发现,成功导入
4)给新品标签添加排序方法
3. 隐藏品牌列表
如果用户输入的是品牌的关键字,则隐藏品牌列表
// 隐藏品牌列表
$scope.keywordsIsBrand = function() {
var bList = $scope.resultMap.brandList;
for(var i = 0 ; i < bList.length ; i ++){
if($scope.searchMap.keywords.indexOf($scope.resultMap.brandList[i].text) != -1){
return true; // 表示存在
}
}
return false;
}
界面引用
4. 搜索页与首页对接
实现思路:首页的搜索框输入关键字,点击搜索后自动跳转到搜索页查询,通过参数传递的方式,将查询关键字传递给搜索页
4.1 pinyougou-portal-web工程
在controller中添加如下代码
// 首页搜索功能
$scope.search = function() {
location.href="http://localhost:9104/#?keywords="+$scope.keywords;
}
在HTML中进行数据绑定
4.2 在pinyougou-search-web工程
在controller中添加如下代码
// 接收首页的跳转请求
$scope.loadkeywords = function() {
$scope.searchMap.keywords = $location.search()['keywords'];
$scope.search();
}
在HTML页面添加初始化调用
5. 更新索引库
5.1 商品审核之后更新索引库
1)修改pinyougou-sellergoods-interface的GoodsService.java,新增方法并下service中实现
@Override
public List<TbItem> findItemListByGoodsIdandStatus(Long[] goodsIds, String status) {
TbItemExample example=new TbItemExample();
com.pinyougou.pojo.TbItemExample.Criteria criteria = example.createCriteria();
criteria.andGoodsIdIn(Arrays.asList(goodsIds));
criteria.andStatusEqualTo(status);
return itemMapper.selectByExample(example);
}
2)修改pinyougou-search-interface的ItemSearchService.java,并在服务层实现
@Override
public void importList(List list) {
solrTemplate.saveBeans(list);
solrTemplate.commit();
}
3)修改pinyougou-manager-web工程的GoodsController.java
@Reference
private ItemSearchService itemSearchService;
@RequestMapping("/updateStatus")
public Result updateStatus(Long[] ids,String status){
try {
goodsService.updateStatus(ids, status);
//按照SPU ID查询 SKU列表(状态为1)
if(status.equals("1")){//审核通过
List<TbItem> itemList = goodsService.findItemListByGoodsIdandStatus(ids, status);
//调用搜索接口实现数据批量导入
if(itemList.size()>0){
itemSearchService.importList(itemList);
}else{
System.out.println("没有明细数据");
}
}
return new Result(true, "修改状态成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "修改状态失败");
}
}
5.2 商品删除同步索引数据
1)修改pinyougou-search-interface的ItemSearchService.java,实现服务层
@Override
public void deleteByGoodsIds(List goodsIdList) {
System.out.println("删除商品ID"+goodsIdList);
Query query=new SimpleQuery();
Criteria criteria=new Criteria("item_goodsid").in(goodsIdList);
query.addCriteria(criteria);
solrTemplate.delete(query);
solrTemplate.commit();
}
2)修改pinyougou-manager-web的GoodsController.java
/**
* 批量删除
* @param ids
* @return
*/
@RequestMapping("/deleGoods")
public Result deleGoods(Long [] ids){
try {
goodsService.deleGoods(ids);
try {
itemSearchService.deleteByGoodsIds(Arrays.asList(ids));
} catch (Exception e) {
e.printStackTrace();
System.out.println("删除索引失败!");
}
return new Result(true, "删除成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "删除失败");
}
}