返回的数据由前端这个折线图来约定的,也就是说折线图对这个数据有这样的要求,我们去适应前端的这个数据格式,也就是前端需要什么样的数据,我们后端给它什么样的数据。
统计指定时间区间之内的每一天的用户数量,每一天的用户数量包含两部分,一个是用户的总量,一个是新增用户数量。
//存放每天的新增用户数量 select count(id) from user where create_time < ? and create_time > ?
//存放每天的总用户数量 select count(id) from user where create_time < ?
我们写一个动态SQL来兼容这两条SQL,也就是说动态的去拼这个where条件。
/**
* 统计指定时间区间的用户数据
* @param begin
* @param end
* @return
*/
public UserReportVO getUserStatistics(LocalDate begin, LocalDate end) {
//存放从begin到end之间的每天对应的日期
List<LocalDate> dateList = new ArrayList<>();
dateList.add(begin);
while (!begin.equals(end)){
begin = begin.plusDays(1);
dateList.add(begin);
}
//存放每天的新增用户数量 select count(id) from user where create_time < ? and create_time > ?
List<Integer> newUserList = new ArrayList<>();
//存放每天的总用户数量 select count(id) from user where create_time < ?
List<Integer> totalUserList = new ArrayList<>();
for (LocalDate date : dateList) {
LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);
Map map = new HashMap();
map.put("end",endTime);
//总用户数量
Integer totalUser = userMapper.countByMap(map);
map.put("begin",beginTime);
//新增用户数量
Integer newUser = userMapper.countByMap(map);
totalUserList.add(totalUser);
newUserList.add(newUser);
}
//封装结果数据
return UserReportVO
.builder()
.dateList(StringUtils.join(dateList,","))
.totalUserList(StringUtils.join(totalUserList,","))
.newUserList(StringUtils.join(newUserList,","))
.build();
}
·功能测试
转义字符
> >
< <
StringUtils.join()是Apache Commons Lang库中的一个方法,用于将数组、集合或迭代器中的元素连接成一个字符串,并通过指定的分隔符分隔这些元素。
StringUtils.join(Object[] array,String separator);
StringUtils.join(Iterable<?> iterable,String separator);
StringUtils.join(Iterator<?> iterator,String separator);
·array:要连接的数组或集合
·separator:连接元素时使用的分隔符
参数类型
StringUtils.join()方法可以接受不同类型的参数:
·数组:可以是任何类型的数组。
·集合:实现了Iterable接口的集合类型。
·迭代器:实现了Iterator接口的迭代器。
返回值
该方法返回一个字符串,其中包含所有元素按指定分隔符连接的结果。如果输入的集合或数组为null,则返回null。