93 lines
2.8 KiB
Java
93 lines
2.8 KiB
Java
|
|
package com.xy.xyaicpzs.service;
|
|||
|
|
|
|||
|
|
import lombok.RequiredArgsConstructor;
|
|||
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|||
|
|
import org.springframework.stereotype.Service;
|
|||
|
|
|
|||
|
|
import java.time.LocalDate;
|
|||
|
|
import java.time.format.DateTimeFormatter;
|
|||
|
|
import java.util.LinkedHashMap;
|
|||
|
|
import java.util.Map;
|
|||
|
|
import java.util.concurrent.TimeUnit;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 页面访问量统计服务
|
|||
|
|
* 使用Redis实现PV统计
|
|||
|
|
*/
|
|||
|
|
@Service
|
|||
|
|
@RequiredArgsConstructor
|
|||
|
|
public class PageViewService {
|
|||
|
|
|
|||
|
|
private final RedisTemplate<String, Object> redisTemplate;
|
|||
|
|
|
|||
|
|
// Redis Key前缀
|
|||
|
|
private static final String PV_TOTAL_KEY = "pv:total"; // 总PV
|
|||
|
|
private static final String PV_DAILY_KEY = "pv:daily:"; // 每日PV前缀
|
|||
|
|
private static final int MAX_DAYS = 90; // 最大保存天数
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 增加页面访问量
|
|||
|
|
*/
|
|||
|
|
public void incrementPageView() {
|
|||
|
|
String today = LocalDate.now().format(DateTimeFormatter.ISO_DATE);
|
|||
|
|
|
|||
|
|
// 增加总PV
|
|||
|
|
redisTemplate.opsForValue().increment(PV_TOTAL_KEY);
|
|||
|
|
|
|||
|
|
// 增加今日总PV
|
|||
|
|
String dailyKey = PV_DAILY_KEY + today;
|
|||
|
|
redisTemplate.opsForValue().increment(dailyKey);
|
|||
|
|
// 设置过期时间为90天
|
|||
|
|
redisTemplate.expire(dailyKey, MAX_DAYS, TimeUnit.DAYS);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取总PV
|
|||
|
|
*/
|
|||
|
|
public Long getTotalPageViews() {
|
|||
|
|
Object value = redisTemplate.opsForValue().get(PV_TOTAL_KEY);
|
|||
|
|
return value != null ? Long.parseLong(value.toString()) : 0L;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取今日总PV
|
|||
|
|
*/
|
|||
|
|
public Long getTodayPageViews() {
|
|||
|
|
String today = LocalDate.now().format(DateTimeFormatter.ISO_DATE);
|
|||
|
|
Object value = redisTemplate.opsForValue().get(PV_DAILY_KEY + today);
|
|||
|
|
return value != null ? Long.parseLong(value.toString()) : 0L;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取指定日期的PV
|
|||
|
|
* @param date 日期,格式:yyyy-MM-dd
|
|||
|
|
*/
|
|||
|
|
public Long getDailyPageViews(String date) {
|
|||
|
|
Object value = redisTemplate.opsForValue().get(PV_DAILY_KEY + date);
|
|||
|
|
return value != null ? Long.parseLong(value.toString()) : 0L;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 根据日期范围获取PV统计(近7天/30天/90天)
|
|||
|
|
* @param days 天数,最大90天
|
|||
|
|
* @return 日期和对应PV的Map,按日期倒序排列
|
|||
|
|
*/
|
|||
|
|
public Map<String, Long> getPageViewsByDays(int days) {
|
|||
|
|
// 限制最大天数为90天
|
|||
|
|
if (days > MAX_DAYS) {
|
|||
|
|
days = MAX_DAYS;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Map<String, Long> result = new LinkedHashMap<>();
|
|||
|
|
LocalDate today = LocalDate.now();
|
|||
|
|
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
|
|||
|
|
|
|||
|
|
for (int i = 0; i < days; i++) {
|
|||
|
|
String date = today.minusDays(i).format(formatter);
|
|||
|
|
Long pv = getDailyPageViews(date);
|
|||
|
|
result.put(date, pv);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
}
|