当前位置: 首页 > news >正文

【项目】Java树形结构集合分页,java对list集合进行分页

Java树形结构集合分页

    • 需求
    • 难点
    • 实现
      • 第一步:查出所有树形集合数据 (需进行缓存处理)
          • selectTree 方法步骤:
          • TreeUtil类:
      • 第二步:分页 GoodsCategoryController
          • 分页
          • getGoodsCategoryTree方法步骤:
      • 第三步:前端实现
    • 效果图:

需求

商品类目树数据量大导致加载太慢,需添加一个分页功能。
在这里插入图片描述

难点

  • 树状结构不能用mybatis-plus自带的分页功能,需自己写分页逻辑
  • 因数据量大,需进行缓存处理

实现

第一步:查出所有树形集合数据 (需进行缓存处理)

List<GoodsCategoryTree> resultList = goodsCategoryService.selectTree(null);
    List<GoodsCategoryTree> selectTree(GoodsCategory goodsCategory);
selectTree 方法步骤:

判断key是否存在,如果存在,直接取缓存的值 ,不存在就从数据库查出数据,并把值存到redis里。

    @Overridepublic List<GoodsCategoryTree> selectTree(GoodsCategory goodsCategory) {if(redisTemplate.hasKey(CacheConstants.GOODS_CATEGORY_TREE_KEY)){log.info("商品类目管理 selectTree cache");List<GoodsCategoryTree> cacheList = SpringUtils.getBean(RedisCache.class).getCacheList(CacheConstants.GOODS_CATEGORY_TREE_KEY);return cacheList;}log.info("商品类目管理 selectTree db");List<GoodsCategoryTree> treeList = getTree(this.list(Wrappers.lambdaQuery(goodsCategory)));if (CollUtil.isNotEmpty(treeList)){SpringUtils.getBean(RedisCache.class).setCacheList(CacheConstants.GOODS_CATEGORY_TREE_KEY,treeList);}return treeList;}

其中 getTree()如下:

	/*** @Description: 构建树*/private List<GoodsCategoryTree> getTree(List<GoodsCategory> entitys) {List<GoodsCategoryTree> treeList = entitys.stream().filter(entity -> !entity.getId().equals(entity.getParentId())).sorted(Comparator.comparingInt(GoodsCategory::getSort)).map(entity -> {GoodsCategoryTree node = new GoodsCategoryTree();BeanUtil.copyProperties(entity, node);return node;}).collect(Collectors.toList());return TreeUtil.build(treeList, CommonConstants.PARENT_ID);}
TreeUtil类:
@UtilityClass
public class TreeUtil {/*** 两层循环实现建树** @param treeNodes 传入的树节点列表* @return*/public <T extends TreeNode> List<T> build(List<T> treeNodes, Object root) {List<T> trees = new ArrayList<>();for (T treeNode : treeNodes) {if (root.equals(treeNode.getParentId())) {trees.add(treeNode);
//				trees.sort(Comparator.comparing(TreeNode::getSort));}for (T it : treeNodes) {if (it.getParentId().equals(treeNode.getId())) {treeNode.addChildren(it);
//					treeNode.getChildren().sort(Comparator.comparing(TreeNode::getSort));}}}return trees;}
}

第二步:分页 GoodsCategoryController

	/*** 返回树形集合分页数据** @return*/@ApiOperation(value = "返回树形集合分页数据")@GetMapping("/treePage")public R getGoodsCategoryTree(Page page, GoodsCategory goodsCategory) {//得到所有数据List<GoodsCategoryTree> resultList = goodsCategoryService.selectTree(null);if (resultList != null && resultList.size() > 0) {page.setTotal(resultList.size());}//分页List<GoodsCategoryTree> finalList =  goodsCategoryService.getFinalListByPage(page,resultList);if (finalList != null && finalList.size() > 0) {page.setRecords(finalList);}return R.ok(page);}
分页
	/** 分页查询类目树*/List<GoodsCategoryTree> getFinalListByPage(Page page , List<GoodsCategoryTree> resultList );
getGoodsCategoryTree方法步骤:

参考:java对list集合进行分页
首先把数据根据创建时间倒序排列,再进行分页

	@Overridepublic List<GoodsCategoryTree> getFinalListByPage(Page page, List<GoodsCategoryTree> resultList) {//根据创建时间倒序排列List<GoodsCategoryTree> treeList = resultList.stream().sorted(Comparator.comparing(GoodsCategoryTree::getCreateTime).reversed()).collect(Collectors.toList());//进行分页List<GoodsCategoryTree> subList = treeList.stream().skip((page.getCurrent()-1)*page.getSize()).limit(page.getSize()).collect(Collectors.toList());return subList;}

第三步:前端实现

avue-crud 组件加上:page.sync=“page”

      <avue-crudref="crud":data="tableData":page.sync="page":permission="permissionList":table-loading="tableLoading":option="tableOption":before-open="beforeOpen"v-model="form"@on-load="getPage"@refresh-change="refreshChange"@row-update="handleUpdate"@row-save="handleSave"@row-del="handleDel">

data() 加上:

      page: {total: 0, // 总页数currentPage: 1, // 当前页数pageSize: 20, // 每页显示多少条ascs: [], //升序字段descs: "create_time", //降序字段},paramsSearch: {},date: [],};

重写getPage()方法:

getPage(page, params) {this.tableLoading = true;fetchTree(Object.assign({current: page.currentPage,size: page.pageSize,descs: this.page.descs,ascs: this.page.ascs,beginTime: this.date[0],endTime: this.date[1],},params,this.paramsSearch)).then((response) => {let tableData = response.data.data.records;this.tableData = tableData;this.page.total = response.data.data.total;this.page.currentPage = page.currentPage;this.page.pageSize = page.pageSize;let parentIdDIC = [{id: "0",name: "顶级分类",parentId: "0",},];tableData.forEach((item) => {parentIdDIC.push({id: item.id,name: item.name,parentId: item.parentId,});});this.$refs.crud.DIC.parentId = parentIdDIC;this.tableLoading = false;}).catch(() => {this.tableLoading = false;});},

效果图:

在这里插入图片描述

http://www.lryc.cn/news/33271.html

相关文章:

  • java.lang.IllegalArgumentException: itemView may not be null
  • [ 攻防演练演示篇 ] 利用 shiro 反序列化漏洞获取主机权限
  • 达人合作加持品牌布局,3.8女神玩转流量策略!
  • 观点丨Fortinet谈ChatGPT火爆引发的网络安全行业剧变
  • 工业企业用电损耗和降损措施研究
  • 高并发、高性能、高可用
  • 剑指 Offer 62. 圆圈中最后剩下的数字
  • 概率论小课堂:高斯分布(正确认识大概率事件)
  • 剑指 Offer 43. 1~n 整数中 1 出现的次数
  • 如何成为程序员中的牛人/高手?
  • 云原生时代顶流消息中间件Apache Pulsar部署实操之轻量级计算框架
  • 数据结构刷题(十九):77组合、216组合总和III
  • PyQt 做美*女GIF设置桌面,每天都很爱~
  • [渗透测试笔记] 54.日薪2k的蓝队hw中级定级必备笔记系列篇3之域渗透黄金票据和白银票据
  • 【异常】Spring Cloud Gateway网关自定义过滤器无法获取到请求体body的内容?不存在的!
  • CNN 卷积神经网络对染色血液细胞分类(blood-cells)
  • Kubernetes学习(三)Service
  • 数学小课堂:古德-图灵折扣估计法和插值法(防范黑天鹅事件的方法)
  • redis getshell方法
  • 【ONE·C || 程序编译简述】
  • MGAT: Multimodal Graph Attention Network for Recommendation
  • 在SNAP中用sentinel-1数据做InSAR测量,以门源地震为例
  • MySQL常用函数
  • 51单片机数字电子钟开题报告
  • day7 HTTP协议
  • 3DCAT+一汽奥迪:共建线上个性化订车实时云渲染方案
  • yii2项目使用frp https2http插件问题
  • 关于 interface{} 会有啥注意事项?下
  • ansible组件介绍和简单playbook测试
  • [数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)