Frage

Es gibt ein neues Abzeichen auf Stack-Überlauf. Die „ woot “ Abzeichen vergeben wird, für die Nutzer die Website für 30 Tage jeden Tag besucht. Wie können Sie eine Funktion wie diese umzusetzen? Wie kann man verfolgen, dass ein Benutzer die Website jeden Tag für X Tage auf einfachste Art und Weise besucht?

Ich dachte, zwei Bereichen, die - eine für den Zeitstempel der letzten Anmeldung, und ein anderer die Tage, an Benutzer kontinuierlich die Website besucht zu zählen. Die Logik ist es, zuerst den Zähler auf 1 gesetzt, und speichern als auch die Zeit der Anmeldung. Schon am nächsten Login prüfen, ob seit dem letzten Login nicht mehr als ein Tag vorbei, und erhöht den Zähler, oder legen Sie es auf 1 zurück und dann wird das Zeitstempel-Feld auf das aktuelle Datum aktualisieren.

Können Sie es einfacher?

War es hilfreich?

Lösung

Sie müssen ein Cookie haben, da die Menschen möglicherweise nicht log in jeden Tag - zum Beispiel, weil sie automatisch für 2 Wochen angemeldet, oder weil sie auf Ihrer Website sind, Dinge zu tun nicht -stop ohne 50 Stunden Schlaf und Mittagessen :) Sie wollen wahrscheinlich tatsächlich zählen, wenn Benutzer auf die Website zugreift.

Nun könnte man theoretisch jeden Zugriff aufzuzeichnen und Datenbankabfragen durchführen, wie oben vorgeschlagen wurde, aber man könnte denken (wie ich), dass es die falsche Balance zwischen Nutzen und die Privatsphäre + Einfachheit trifft.

Der Algorithmus Sie angaben, ist mangelhaft in nahe liegender Weise: Da Sie speichern nur ganze Anzahl von Tagen, verpassen Sie den Benutzer, der sich anmeldet und aus alle 12 Stunden (Ihr Algorithmus würde die Anzahl der Tage als 1 halten)

Hier ist die Lösung, die ich finden sein saubersten mit zwei Datumsfelder pro Benutzer, in einer Art selbsterklärend nicht-objektorientierten 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 )
    ...

(Bitte verzeihen Sie meine Pythonic Fähigkeiten, ich bin ein akademischer und erstmalige Website Benutzer)

Sie können diese Aufgabe nicht mit ein Variable. Ich bin sicher, dass jemand ein sauberes Argument beweist diese Tatsache schreiben kann.

Andere Tipps

Eigentlich, wenn die Mitgliedbesuche in einer SQL-Datenbank sind, können Sie das Ganze mit einer einzigen SQL-Abfrage tun. Dies ist wahrscheinlich auch schneller als alle Daten über zu einem Client-Programm schlepping es zu überprüfen, trotzdem:

/*
    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

verfolgt jeden Besuch in Ihrer Datenbank mit einem Zeitstempel (die Sie wahrscheinlich sowieso schon tun). Dann erstellen Sie für Tag eine SQL-Anweisung und Gruppe das Ergebnis, während Sie die Anzahl der Besuche an diesem Tag zählen. Im Zeitraum der letzten 30 Tage, es ist nicht ein 0-Besuch Tag haben darf ...

I zweite ropstah Ansatz. Benutzerstatistiken wie Login-Zeit usw. sind in der Regel in der Datenbank. Wir müssen ableiten bestimmte Tatsachen aus den verfügbaren Daten. Anstatt also für jeden Besuch einen Zähler aufweisen und so erhöht wird, würde ich einen Batch-Job bevorzugen, die auf den Benutzer-Login-Daten laufen und die Ergebnisse für diesen Tag veröffentlichen.

Aber sobald ein Benutzer „woot“ ed, möchten Sie vielleicht Computing „woot“ für diesen Benutzer ness stoppen. Else, gibt es eine Chance des Benutzers „wooted“ jeden Tag bekommen, bis ein No-Login Tag angetroffen wird. (Aber das ist ein kleines Problem).

Wenn dies das einzige, was Sie sich anmelden wollen, dann vielleicht ist das eine gute Lösung. Allerdings Ich mag Logik halten und die Protokollierung zu trennen, sowohl die Menge von Rohdaten zu meiner Verfügung zu erhöhen, sowie die Möglichkeit Zwicken der Logik, ohne vorhandene Daten zu brechen.

In diesem Fall würde ich jeden Besuch einzuloggen oder jede Aktion (je nach Anforderung / Raum / etc) und dann eine sproc oder ein Verfahren irgendwo schreiben, der die Daten überprüft und zurück true (entspricht Kriterien für Abzeichen) oder falsch ( nicht Kriterien entsprechen).

Der einzige Fall, in dem ich ein bestimmten Schema-Informationen zu halten schaffen würde, wie das war, wenn die erforderlichen Berechnungen viel zu lange gedauert haben, entweder wegen der Datenmenge oder die Komplexität davon.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top