若依框架ruoyi前后端实现自定义分页功能(ES分页查询)

1、分页需求

若依ruoyi框架主要针对Sql进行了分页集成,像平时别的一些数据库或者中间件的分页,则需要自己实现.
本文主要使用ES的分页查询为例,展示前后端的基本操作,原理可以类推到其他中间件分页查询上.

2、vue前端保持不变

//...
//前端逻辑基本不变,使用原来的组件即可
<pagination
  v-show="total>0"
  :total="total"
  :page.sync="queryParams.pageNum"
  :limit.sync="queryParams.pageSize"
  @pagination="getList"
/>
//...

3、controller组装前端所需分页对象

/**
 * 查询XX列表
 * query: 查询条件对象
 */
@PreAuthorize("@ss.hasPermi('xxx:xxx:list')")
@GetMapping("/list")
public TableDataInfo list(Query query) {
    
    
	//startPage();
	//pageNum和pageSize的设置由query传入进行处理,传到serviceImpl方法中
	
    Page<TestVo> pageInfo = testService.selectMyPage(query);
    List<TestVo> list = pageInfo.getContent();//ES的分页结果list对象

	//getDataTable(list);
	//将原来的getDataTable()方法拿出来进行rows和total的赋值,再传给前端
    TableDataInfo rspData = new TableDataInfo();
    rspData.setCode(HttpStatus.SUCCESS);
    rspData.setMsg("查询成功");
    rspData.setRows(list);
    rspData.setTotal(pageInfo.getTotalElements());//ES的分页数据总数
    return rspData;
}

4、serviceimpl实现分页逻辑

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

/**
* 查询热词管理列表
*/
@Override
public Page<TestVo> selectMyPage(Query query){
    
    
	//接受前端传过来的分页参数
    Integer pageNum = query.getPageNum();
    Integer pageSize = query.getPageSize();

    if(pageNum<1 || pageSize<1){
    
    
        throw new RuntimeException("分页参数需从1开始");
    }

    //组装查询条件 must类似and匹配到所有字段后进行组合查询
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    if(StringUtils.isNotBlank(query.getCol1())){
    
    
        queryBuilder.must(termQuery("col1", query.getCol1()));
    }
    if(StringUtils.isNotBlank(query.getCol2())){
    
    
        //类似like的操作,针对不能分词的字段进行模糊查询,数据量大不推荐,性能不友好
        queryBuilder.must(wildcardQuery("col2", "*"+query.getCol2()+"*"));
    }

    NativeSearchQuery build = new NativeSearchQueryBuilder()
            .withQuery(queryBuilder)
            .withPageable(PageRequest.of(pageNum-1, pageSize))
            .build();
    log.info("列表查询的语句:{}", build.getQuery().toString());

    SearchHits<TestVo> search = elasticsearchRestTemplate.search(build, TestVo.class);
    SearchPage<TestVo> page = SearchHitSupport.searchPageFor(search, build.getPageable());

    //高亮结果集,也可以用page.getHighlightFields()获取
    List<TestVo> list = new ArrayList<>();
    for (SearchHit<TestVo> each : page) {
    
    
        TestVo vo = each.getContent();
        list.add(vo);
    }
    //组装分页对象 这里主要是ES返回的分页对象
    Page<TestVo> pageInfo = new PageImpl<>(list, build.getPageable(), search.getTotalHits());
    return pageInfo;
    
    //原来的mapper查询如下
	//return testMapper.selectTestList(vo);
}

猜你喜欢

转载自blog.csdn.net/csdn_avatar_2019/article/details/129758228