java - 计算每天的点击次数
问题描述
我需要帮助来根据用户选择的包实现每天的点击量。这是我到目前为止所做的,但它不能正常工作:
实体:
@Entity
@Table(name = "users")
public class UsersModel implements Serializable {
@Column(name = "plan")
private String plan;
@Column(name = "plan_last_activity")
@Convert(converter = LocalDateTimeConverter.class)
private LocalDateTime planLastActivity;
}
代码:
public boolean calculateClickTimes() {
String userName = SecurityUtils.getSubject().getPrincipal().toString();
QueryDashboardHelper queryHelper = new QueryDashboardHelper();
UsersModel user = queryHelper.getUserByUserName(userName);
String plan = user.getPlan(); // silver/gold/platinum/diamond
int todayHits = user.getTradesPerDay();
LocalDateTime lastHit = user.getPlanLastActivity();
LocalDateTime now = LocalDateTime.now();
LocalDateTime tenSecondsLater = now.plusDays(1);
long diff = ChronoUnit.DAYS.between(lastHit, tenSecondsLater);
switch(plan) {
case "diamond":
if(diff >= 1 && todayHits >= 20) {
todayHits = 0;
return true;
}
break;
case "platinum":
if(diff >= 1 && todayHits >= 15) {
todayHits = 0;
return true;
}
break;
case "gold":
if(diff >= 1 && todayHits >= 10) {
todayHits = 0;
return true;
}
break;
case "silver":
if(diff >= 1 && todayHits >= 5) {
// User has clicked 5 times today
todayHits = 0;
return true;
}
break;
default:
}
return false;
}
总体思路是,根据所选套餐(银/金/铂金/钻石)和数据库中的数据,限制用户在网页中进行点击plan
,tradesPerDay
并planLastActivity
限制当日允许的点击。你能给我一些建议如何正确地实现这个代码吗?
解决方案
它是一个建议机制框架,可以让您了解如何使用 Spring aspect 来处理此类场景
创建注释,例如 TrackHit:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TrackHit{
}
并创建一个方面
@Aspect
@Component
public class HitTrackerAspect {
private final HitTrackerService hitTrackerService;
public HitTrackerAspect(HitTrackerService hitTrackerService) {
this.hitTrackerService = hitTrackerService;
}
// annotation package also should provided if present e.g @annotation(x.y.TrackHit)
@Around(value = "@annotation(TrackHit)")
public Object TrackUserHit(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = signature.getMethod();
TrackHit trackHit = method.getAnnotation(TrackHit.class);
if(trackHit !=null){
String userName = SecurityUtils.getSubject().getPrincipal().toString();
if (userName!=null) {
// hitTrack service is used to check user plan , logic implemented inside isUserAllowed method
// of HitTrackerService
boolean allowed = hitTrackerService.isUserAllowed(userName)
if(allowed){
return proceedingJoinPoint.proceed();
}
}
}
}
}
在需要由用户调用的服务中添加 TrackHit 注释,方面将检查是否允许将继续
例如,调用受方面登录限制的最新价格,应在调用前检查
@Service
public class PriceInquiryService {
@TrackHit
public long getLatestPrice(Long itemCode){
// latest price logic here
}
}
推荐阅读
- mysql - 查询执行很慢?
- aws-sdk - 自动刷新 RDS IAM 令牌凭证
- jquery - Is there any reliable jQuery multiselect that is searchable AND has clickable optgroups?
- python - 从多索引中选择时如何避免链式应用?
- javascript - 如何在 Chrome 扩展中的标签更新后维护或重新建立内容和背景之间的连接?
- arduino - Arduino 串行输入值处理
- laravel - Laravel Eloquent 在查询中按条件添加 'where' 子句
- winapi - 如何使用自定义搜索结果启动 Windows 资源管理器
- kubernetes - 是否可以直接在 Azure Kuberenetes 服务 (AKS) 的浏览器中访问 kubernetes 仪表板(无需其他命令)
- android - Nosuchmethod:org.jetbrains.kotlin.resolve.diagnostics.DiagnosticSuppressor$Companion.getEP_NAME() 来自 kotlin-compiler-embeddable.jar