update: 提交所有修改和新增功能代码

This commit is contained in:
lihanqi
2026-02-14 12:15:01 +08:00
parent dc59f393fa
commit ec597ffe2e
77 changed files with 4417 additions and 2411 deletions

View File

@@ -0,0 +1,92 @@
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;
}
}