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.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.VisitStatsVO; 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.math.BigDecimal; 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; } /** * 获取访问统计 * * @return */ @Override public List getVisitStats() { List list = new ArrayList<>(); // 访问量 VisitStatsVO pvStats = this.baseMapper.getPvStats(); pvStats.setTitle("浏览量"); pvStats.setType("pv"); pvStats.setGranularityLabel("日"); list.add(pvStats); // 访客数 VisitStatsVO uvStats = new VisitStatsVO(); uvStats.setTitle("访客数"); uvStats.setType("uv"); uvStats.setTodayCount(100); uvStats.setTotalCount(2000); uvStats.setGrowthRate(BigDecimal.ZERO); uvStats.setGranularityLabel("日"); list.add(uvStats); // IP数 VisitStatsVO ipStats = this.baseMapper.getIpStats(); ipStats.setTitle("IP数"); ipStats.setType("ip"); ipStats.setGranularityLabel("日"); list.add(ipStats); return list; } }