Как отследить, что пользователь посещал сайт каждый день в течение Х дней?

StackOverflow https://stackoverflow.com/questions/932610

  •  06-09-2019
  •  | 
  •  

Вопрос

В Stack Overflow появился новый значок."ух ты«Значок вручается пользователям, посещавшим сайт каждый день в течение 30 дней.Как можно реализовать такую ​​функцию?Как можно самым простым способом отследить, что пользователь посещал сайт каждый день в течение X дней?

Я подумал о том, чтобы иметь два поля: одно для отметки времени последнего входа в систему, а другое для подсчета дней, в течение которых пользователь постоянно посещал сайт.Логика заключается в том, чтобы сначала установить счетчик на 1, а также сохранить время входа в систему.При следующем входе в систему проверьте, прошло ли с момента последнего входа не более одного дня, и увеличьте счетчик или установите его обратно на 1.А затем обновите поле метки времени до текущей даты.

Можете ли вы сделать это проще?

Это было полезно?

Решение

Вам необходимо иметь файл cookie, поскольку люди могут не авторизоваться каждый день - например, потому что они автоматически входят в систему в течение 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 )
    ...

(Пожалуйста, простите мои навыки Pythonic, я академик и впервые пользуюсь сайтом)

Вы не можете выполнить эту задачу с один переменная.Я уверен, что кто-нибудь сможет привести четкие аргументы, подтверждающие этот факт.

Другие советы

На самом деле, если посещения участника хранятся в базе данных 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

Отслеживайте каждое посещение в своей базе данных с помощью отметки времени (что вы, вероятно, уже сделали).Затем создайте оператор sql и сгруппируйте результат по дням, одновременно подсчитывая количество посещений в этот день.В период последних 30 дней не допускается наличие 0-дневного посещения...

Я поддерживаю подход ропста.Статистика пользователей, такая как время входа в систему и т. д., обычно доступна в базе данных.Нам необходимо извлечь определенные факты из имеющихся данных.Поэтому вместо того, чтобы иметь счетчик для каждого посещения и увеличивать данные, я бы предпочел пакетное задание, которое выполняется на данных входа пользователя и публикует результаты за этот день.

Но как только пользователь «усердствует», вы можете захотеть прекратить вычисление «удовольствия» для этого пользователя.В противном случае существует вероятность того, что пользователь будет «обижен» каждый день, пока не наступит день без входа в систему.(но это незначительная проблема).

Если это единственное, что вы хотите регистрировать, возможно, это хорошее решение.Однако мне нравится разделять логику и ведение журнала, чтобы увеличить объем необработанной информации в моем распоряжении, а также позволить настраивать логику, не нарушая существующие данные.

В этом случае я бы регистрировал каждое посещение или каждое действие (в зависимости от требований/пространства/и т. д.), а затем писал где-нибудь процедуру или метод, который проверял данные и возвращал true (соответствует критериям для значка) или false (не соответствует критериям). критерии соответствия).

Единственный случай, когда я создавал конкретную схему для хранения подобной информации, заключался в том, что требуемые вычисления занимали слишком много времени либо из-за объема данных, либо из-за их сложности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top