有对堆栈溢出新的徽章。将“活泉”徽章授予用户访问该网站每天为30天。你怎么能实现这样的功能?你怎么能跟踪用户以最简单的方式访问该网站每天为X天?

我想有两个字段 - 一个用于上次登录的时间戳,另一个依靠用户的持续天访问该网站。所述逻辑将第一计数器设定为1,并存储登录时也是如此。在紧接着的下登录,检查自上次登录不超过一天的过去,并增加计数器,或将其设置回1然后时间戳字段更新为当前日期。

您可以做简单?

有帮助吗?

解决方案

您确实需要有一个cookie,因为人们可能不会登录的每一天 - 例如,因为它们是自动登录2周,或者是因为他们对你的网站做的事情非-stop不睡觉,午餐和晚餐50小时:)你可能实际上要计数,当用户访问该网站。

现在,一个理论上可以记录每一个访问并进行数据库查询,正如上述建议,但你可能会想(像我一样),它撞击有用性和隐私+简单的错误平衡。

您指定的算法是一个明显的不足之处,:因为你只存储整个的天数,你错过了谁的日志和出每12小时(你的算法将保留天数为1)用户

下面就是我觉得是清洁用溶液的每两个用户的日期字段中,在一种不言自明的非面向对象的Python:

# user.beginStreak----user.lastStreak is the last interval when 
# user accessed the site continuously without breaks for more than 25h 

def onRegister (user):
    ...
    user.beginStreak = user.endStreak = time() # current time in seconds 
    ...

def onAccess (user): 
    ...
    if user.endStreak + 25*60*60 < time():
        user.beginStreak = time()
    user.endStreak = time()
    user.wootBadge = ( user.endStreak-user.beginStreak > 30*24*60*60 )
    ...

(请原谅我的Python的技能,我是一个学术和首次现场用户)

可以不做的一个的变量此任务。我敢肯定有人可以写一个干净的说法证明了这一事实。

其他提示

其实,如果会员的访问是在SQL数据库中,你可以做整个事情有一个SQL查询。这也可能比schlepping所有的数据到客户端程序更快反正要检查它:

/*
    Find all members who visited at least once every day
  for 30 or more days.  --RBarryYoung, 2009-05-31
*/
;WITH
  cteVisitDays as (
    Select
      MemberID
    , DATEDIFF(dd,'2008-06-01',VisitTime) as VisitDay
     From tblMembersLog
     Where Not Exists( Select * From tblMemberTags T
    Where T.MemberID = tblMembersLog.MemberID
     And T.TagName = 'WOOT!' )
     Group By MemberID
        , DATEDIFF(dd,'2008-06-01',VisitTime)
    )
, cteVisitRunGroups as (
    Select 
      MemberID
    , VisitDay - Row_Number() Over(
            Partition By MemberID
            Order By VisitDay
        ) as RunGrouping
     From cteVisitDays
     )
SELECT Distinct
  MemberID
 From cteVistRunGroups
 Group By MemberId, RunGrouping
 Having COUNT(*) >= 30

跟踪您的数据库与时间戳(你可能已经做反正)每次访问。然后一天创建的SQL语句和组的结果,而你的那一天算访问的次数。在过去30天的期限,它是不允许有一个0访日...

我第二ropstah的做法。像登录时间等用户统计资料,通常在数据库中。我们需要得到某些事实了可用的数据。因此,而不是每次访问一个计数器和递增的东西,我宁愿上的用户登录数据中运行一个批处理作业并公布结果的那一天。

但是,一旦用户“活泉”版,你可能要停止计算“活泉”性的用户。 否则,有越来越“wooted”每一天,直到遇到一个没有登录天用户的机会。 (但是这是一个小问题)。

如果这是你想登录的唯一的事情,那么也许这是一个很好的解决方案。然而,我想保持逻辑和记录分开,既增加的原信息的量在我的处置,以及允许逻辑的调整而不会破坏现有的数据。

在这种情况下,我将记录每次访问或每一个动作(取决于要求/空间/等),然后写一个存储过程或某处的方法,其检查的数据和返回真(匹配用于徽章的标准)或假(不匹配条件)。

我想去创建或者是因为数据的量或它们的复杂性的一个特定的模式来保存信息等,这是如果所需的计算采取了时间太长,的唯一情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top