Files
cpzs-backend/src/main/java/com/xy/xyaicpzs/service/PageViewService.java
2026-02-14 12:15:01 +08:00

93 lines
2.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}