Stack Overflow上有一个新徽章。 “woot”徽章授予每天访问该网站30天的用户。你怎么能实现这样的功能?如何以最简单的方式跟踪用户每天访问网站X天的情况?
我想过有两个字段 - 一个用于上次登录的时间戳,另一个用于计算用户持续访问该网站的日期。逻辑是首先将计数器设置为1,并存储登录时间。在下次登录时,检查自上次登录后是否超过一天,并递增计数器,或将其设置回1.然后将时间戳字段更新为当前日期。
你能简单一点吗?
答案 0 :(得分:4)
你需要有一个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 )
...
(请原谅我的Pythonic技能,我是学术和第一次网站用户)
您无法使用一个变量执行此任务。我相信有人可以写出一个证明这一事实的干净的论据。
答案 1 :(得分:2)
实际上,如果成员的访问位于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
答案 2 :(得分:1)
使用时间戳跟踪数据库中的每次访问(无论如何,您可能已经这样做了)。然后创建一个sql语句并按天分组结果,同时计算当天的访问次数。在过去30天内,不允许有0个访问日...
答案 3 :(得分:1)
我是第二个ropstah的方法。登录时间等用户统计信息通常可在数据库中使用。我们需要从可用数据中得出某些事实。因此,我不想为每次访问和增加内容设置计数器,而是希望在用户登录数据上运行批处理作业并发布当天的结果。
但是,一旦用户“woot”ed,您可能想要停止为该用户计算“woot”。 否则,用户有可能每天都“吵醒”,直到遇到无登录日。 (但这是一个小问题。)
答案 4 :(得分:0)
如果这是您想要记录的唯一内容,那么这可能是一个很好的解决方案。但是,我喜欢将逻辑和日志分开,既可以增加我可以使用的原始信息量,又可以在不破坏现有数据的情况下调整逻辑。
在这种情况下,我会记录每次访问或每个操作(取决于要求/空间/等),然后在某处检查数据并返回true(匹配徽章的标准)或false(与标准不符。)
我会创建一个特定模式来保存这样的信息的唯一情况是,由于数据量或其复杂性,所需的计算耗时太长。