一、导言
工作的时候需要导出由后端传给前端easyui datagrad的分页数据
但是调用$('#dg').datagrid('getRows');方法只能获取当前分页的数据,在网上查了相关帖子但都是“标题党”,没有实际的解决这个需求。故写了这篇文章记录一下我如何解决这个问题的思路,希望可以对后人解决此类问题提供帮助。
二、解决思路
首先明确一点:
easyui中 $('#dg').datagrid('getRows')指令只能获取当前分页的数据,并不能通过各种骚操作获取所有分页数据(除非魔改easyui的库)。
从前端来说这条路封死了,那么我们可以从后端下手:
以下代码是正常我们前端easyui-datagrad绑定的后端查询接口的写法
@ResponseBody @RequestMapping("/list") @RequiresPermissions(value = {"国家"}, logical = Logical.OR) public Map<String, Object> list(Gj gj, @RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "rows", required = false) Integer rows) throws Exception { User user = userService.findByUserName((String) SecurityUtils.getSubject().getPrincipal()); Map<String, Object> resultMap = new HashMap<>(); List<Sort.Order> orders = Collections.singletonList(new Sort.Order(Sort.Direction.DESC, "id")); List<Gj> gjList = gjService.list(gj, page, rows, Sort.by(orders)); Long total = gjService.getCount(gj); resultMap.put("rows", gjList); resultMap.put("total", total); logService.save(new Log(Log.SEARCH_ACTION, "查询国家信息")); return resultMap; }
根据id主键降序排序,通过前端传入的实体类信息分页查询数据并返回数据行和总行数,前端datagrad每次更新都查询接口,所以每一页数据都只是部分数据,由于后端返回的数据并不是所有数据,想要获取数据就只能从后端下手。
在Servicelmpl层实现通过传入实体信息和排序条件查询返回List的方法
@Override public List<Gj> listByCkhz(Gj gj, Sort sort) { return gjRepository.findAll(new Specification<Gj>() { @Override public Predicate toPredicate(Root<Gj> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate predicate = cb.conjunction(); //一些判断实体字段为空的逻辑,如果为空那么直接查询所有数据 } return predicate; } }, sort); }
再在Controller层定义一个接口,传入实体类信息,根据实体类查询出所有符合条件的数据(也就是不再分表查询,而是全部查询),获取到全部数据之后再根据各自的业务逻辑去进行下一步的操作。
比如以我举例需要拿到所有的数据导出为Excel表格,那么可以通过遍历List数据,将每一条数据使用POI库添加行信息,最后导出表格。
这样就可以解决前端不能取到所有表信息这一痛点,如果需要拿到所有数据给前端进行操作,在Controller层定义接口的时候也可以直接封装成JSON返回给前端,细节方面就按照各自不同的业务逻辑需要去做咯。