代码之家  ›  专栏  ›  技术社区  ›  viam0Zah

如何跟踪用户在X天内每天访问网站的情况?

  •  6
  • viam0Zah  · 技术社区  · 17 年前

    堆栈溢出上有一个新的标记。“ woot “30天内,每天访问网站的用户将获得徽章。如何实现这样的功能?如何以最简单的方式跟踪用户每天访问站点x天?

    我想到了两个字段——一个是最后一次登录的时间戳,另一个是计算用户连续访问该站点的天数。逻辑是首先将计数器设置为1,并存储登录时间。在下一次登录时,检查自上次登录后不超过一天,并递增计数器,或将其设置回1。然后将时间戳字段更新为当前日期。

    你能简单点吗?

    5 回复  |  直到 12 年前
        1
  •  4
  •   ilya n.    17 年前

    你需要一块饼干,因为人们可能不会 登录 每天——例如,因为他们自动登录2周,或者因为他们在你的网站上不停地做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 )
        ...
    

    (请原谅我的蟒蛇技能,我是一个学术和第一次网站用户)

    您不能用 变量。我相信有人可以写一个明确的论点来证明这个事实。

        2
  •  2
  •   RBarryYoung    17 年前

    实际上,如果成员的访问位于SQL数据库中,那么您可以使用单个SQL查询来完成整个工作。这也可能比将所有数据传输到客户端程序以进行检查更快:

    /*
        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
    
        3
  •  1
  •   Ropstah    17 年前

    用时间戳跟踪数据库中的每个访问(您可能已经这样做了)。然后创建一个SQL语句并按天对结果进行分组,同时计算当天的访问次数。在过去30天内,不允许有0天的访问…

        4
  •  1
  •   Sathya    17 年前

    我支持罗普斯塔的方法。诸如登录时间等用户统计信息通常在数据库中可用。我们需要从现有数据中得出某些事实。因此,我不希望每次访问都有一个计数器和递增的内容,而是希望有一个批处理作业,它运行在用户登录数据上,并发布当天的结果。

    但是一旦一个用户“求爱”了,你可能会想停止计算那个用户的“求爱”程度。 否则,用户每天都有机会得到“求爱”,直到遇到一个没有登录的日子。(但这是个小问题)。

        5
  •  0
  •   Dave Bauman    17 年前

    如果这是您唯一想要记录的东西,那么这可能是一个好的解决方案。但是,我喜欢将逻辑和日志分开,这两者都是为了增加我可以使用的原始信息量,并且允许在不破坏现有数据的情况下调整逻辑。

    在这种情况下,我会记录每次访问或每个操作(取决于需求/空间等),然后在某个地方编写一个存储过程或方法,该存储过程或方法检查数据并返回“真”(与标记的标准匹配)或“假”(与标准不匹配)。

    我创建一个特定模式来保存这样的信息的唯一情况是,所需的计算时间太长,可能是因为数据量太大,也可能是因为数据的复杂性。