TASK:Global Award记录访客量

This commit is contained in:
2026-05-13 16:26:47 +08:00
parent 9a4a5d5504
commit bb682e56fa
4 changed files with 86 additions and 0 deletions

View File

@@ -5,6 +5,7 @@ import com.ai.da.model.dto.*;
import com.ai.da.model.dto.ContestantDTO; import com.ai.da.model.dto.ContestantDTO;
import com.ai.da.model.vo.CheckOTPVO; import com.ai.da.model.vo.CheckOTPVO;
import com.ai.da.model.vo.ContestantCountVO; import com.ai.da.model.vo.ContestantCountVO;
import com.ai.da.model.vo.PageVisitCountVO;
import com.ai.da.service.GlobalAwardService; import com.ai.da.service.GlobalAwardService;
import com.ai.da.service.upload.UploadService; import com.ai.da.service.upload.UploadService;
import com.ai.da.service.upload.UploadTask; import com.ai.da.service.upload.UploadTask;
@@ -198,6 +199,19 @@ public class GlobalAwardController {
return Response.success(globalAwardService.getContestantCount()); return Response.success(globalAwardService.getContestantCount());
} }
@PostMapping("/page/visit")
@ApiOperation(value = "记录比赛页面访问量", notes = "记录比赛页面的访问量,包含两种统计方式:每次访问/刷新计一次以及5秒内刷新只计一次")
public Response<Void> recordPageVisit(@ApiParam(value = "会话ID用于5秒内去重判断", required = false) @RequestParam(value = "sessionId", required = false) String sessionId) {
globalAwardService.recordPageVisit(sessionId);
return Response.success();
}
@GetMapping("/page/visit/count")
@ApiOperation(value = "获取比赛页面访问量", notes = "获取比赛页面的两种访问量rawVisitCount每次访问/刷新计一次)和 uniqueVisitCount5秒内刷新只计一次")
public Response<PageVisitCountVO> getPageVisitCount() {
return Response.success(globalAwardService.getPageVisitCount());
}
} }

View File

@@ -0,0 +1,23 @@
package com.ai.da.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageVisitCountVO {
/**
* 每次访问或刷新都计一次(不去重)
*/
private Long rawVisitCount;
/**
* 5秒内刷新只算一次去重后的真实访客数
*/
private Long uniqueVisitCount;
}

View File

@@ -3,6 +3,7 @@ package com.ai.da.service;
import com.ai.da.model.dto.ContestantDTO; import com.ai.da.model.dto.ContestantDTO;
import com.ai.da.model.vo.CheckOTPVO; import com.ai.da.model.vo.CheckOTPVO;
import com.ai.da.model.vo.ContestantCountVO; import com.ai.da.model.vo.ContestantCountVO;
import com.ai.da.model.vo.PageVisitCountVO;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.Map; import java.util.Map;
@@ -46,6 +47,22 @@ public interface GlobalAwardService {
* @return 参赛者数量和最大参赛者编号 * @return 参赛者数量和最大参赛者编号
*/ */
ContestantCountVO getContestantCount(); ContestantCountVO getContestantCount();
/**
* 记录比赛页面的访问量
* <ul>
* <li>rawVisitCount: 每次访问或刷新都计一次(不去重)</li>
* <li>uniqueVisitCount: 5秒内刷新只算一次基于会话去重</li>
* </ul>
* @param sessionId 会话ID用于5秒去重判断
*/
void recordPageVisit(String sessionId);
/**
* 获取比赛页面的两种访问量
* @return 原始访问量和去重访问量
*/
PageVisitCountVO getPageVisitCount();
} }

View File

@@ -13,6 +13,7 @@ import com.ai.da.model.dto.ContestantDTO;
import com.ai.da.model.dto.PublishSysNotificationDTO; import com.ai.da.model.dto.PublishSysNotificationDTO;
import com.ai.da.model.vo.CheckOTPVO; import com.ai.da.model.vo.CheckOTPVO;
import com.ai.da.model.vo.ContestantCountVO; import com.ai.da.model.vo.ContestantCountVO;
import com.ai.da.model.vo.PageVisitCountVO;
import com.ai.da.service.GlobalAwardService; import com.ai.da.service.GlobalAwardService;
import com.ai.da.service.MessageCenterService; import com.ai.da.service.MessageCenterService;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
@@ -619,6 +620,37 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
private String nullSafe(String value) { private String nullSafe(String value) {
return value != null ? value : "N/A"; return value != null ? value : "N/A";
} }
private static final String RAW_VISIT_COUNT_KEY = "GLOBAL_AWARD:visit:raw";
private static final String UNIQUE_VISIT_SET_KEY = "GLOBAL_AWARD:visit:unique";
private static final String SESSION_VISIT_KEY_PREFIX = "GLOBAL_AWARD:visit:session:";
private static final long SESSION_DEDUP_SECONDS = 5L;
@Override
public void recordPageVisit(String sessionId) {
redisUtil.increaseCount(RAW_VISIT_COUNT_KEY);
if (StringUtils.isNotBlank(sessionId)) {
String sessionKey = SESSION_VISIT_KEY_PREFIX + sessionId;
if (!redisUtil.hasKey(sessionKey)) {
redisUtil.increaseCount(UNIQUE_VISIT_SET_KEY);
redisUtil.addToString(sessionKey, "1", SESSION_DEDUP_SECONDS);
}
} else {
redisUtil.increaseCount(UNIQUE_VISIT_SET_KEY);
}
}
@Override
public PageVisitCountVO getPageVisitCount() {
Long raw = redisUtil.getIncrementCount(RAW_VISIT_COUNT_KEY);
Long unique = redisUtil.getIncrementCount(UNIQUE_VISIT_SET_KEY);
return PageVisitCountVO.builder()
.rawVisitCount(raw != null ? raw : 0L)
.uniqueVisitCount(unique != null ? unique : 0L)
.build();
}
} }