package com.youlai.system.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.system.common.util.DateUtils; import com.youlai.system.model.bo.VisitCount; import com.youlai.system.model.entity.SysLog; import com.youlai.system.model.query.LogPageQuery; import com.youlai.system.model.vo.LogPageVO; import com.youlai.system.model.vo.VisitTrendVO; import com.youlai.system.service.SysLogService; import com.youlai.system.mapper.SysLogMapper; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 系统日志 服务实现类 * * @author Ray * @since 2.10.0 */ @Service public class SysLogServiceImpl extends ServiceImpl implements SysLogService { /** * 获取日志分页列表 * * @param queryParams 查询参数 * @return */ @Override public Page listPagedLogs(LogPageQuery queryParams) { // 格式化为数据库日期格式,避免日期比较使用格式化函数导致索引失效 DateUtils.toDatabaseFormat(queryParams, "startDate", "endDate"); return this.baseMapper.listPagedLogs(new Page(queryParams.getPageNum(), queryParams.getPageSize()), queryParams); } /** * 获取访问趋势 * * @param startDate 开始时间 * @param endDate 结束时间 * @return */ @Override public VisitTrendVO getVisitTrend(LocalDate startDate, LocalDate endDate) { VisitTrendVO visitTrend= new VisitTrendVO(); List dates = new ArrayList<>(); // 获取日期范围内的日期 while (!startDate.isAfter(endDate)) { dates.add(startDate.toString()); startDate = startDate.plusDays(1); } visitTrend.setDates(dates); // 获取访问量和访问 IP 数的统计数据 List pvCounts = this.baseMapper.getPvCounts(dates.get(0) + " 00:00:00", dates.get(dates.size() - 1) + " 23:59:59"); List ipCounts = this.baseMapper.getIpCounts(dates.get(0) + " 00:00:00", dates.get(dates.size() - 1) + " 23:59:59"); // 将统计数据转换为 Map Map pvMap = pvCounts.stream().collect(Collectors.toMap(VisitCount::getDate, VisitCount::getCount)); Map ipMap = ipCounts.stream().collect(Collectors.toMap(VisitCount::getDate, VisitCount::getCount)); // 匹配日期和访问量/访问 IP 数 List pvList = new ArrayList<>(); List ipList = new ArrayList<>(); for (String date : dates) { pvList.add(pvMap.getOrDefault(date, 0)); ipList.add(ipMap.getOrDefault(date, 0)); } visitTrend.setPvList(pvList); visitTrend.setIpList(ipList); return visitTrend; } }