首页 > 解决方案 > 计算每天的点击次数

问题描述

我需要帮助来根据用户选择的包实现每天的点击量。这是我到目前为止所做的,但它不能正常工作:

实体:

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

总体思路是,根据所选套餐(银/金/铂金/钻石)和数据库中的数据,限制用户在网页中进行点击plantradesPerDayplanLastActivity限制当日允许的点击。你能给我一些建议如何正确地实现这个代码吗?

标签: javasqlif-statementjava-8switch-statement

解决方案


它是一个建议机制框架,可以让您了解如何使用 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 
    }
}

推荐阅读