Get daily visits

This commit is contained in:
Las Zenow 2013-05-31 23:59:01 +02:00
parent cb856b002f
commit ca0b25a274
3 changed files with 57 additions and 26 deletions

View file

@ -247,24 +247,25 @@ func (d *DB) GetTags(numTags int) ([]string, error) {
return tags, nil return tags, nil
} }
type visits struct { type Visits struct {
Month string "_id" Date int64 "_id"
Count int "value" Count int "value"
} }
func (d *DB) GetMonthVisits() ([]visits, error) { func (d *DB) GetDayVisits(start time.Time) ([]Visits, error) {
var mr mgo.MapReduce var mr mgo.MapReduce
mr.Map = "function() { " + mr.Map = `function() {
"var month = this.date.getMonth() + 1;" + var day = Date.UTC(this.date.getFullYear(),
"var year = this.date.getFullYear();" + this.date.getMonth(),
"emit(month + \".\" + year, 1);" + this.date.getDate());
"}" emit(day, 1);
mr.Reduce = "function(date, vals) { " + }`
"var count = 0;" + mr.Reduce = `function(date, vals) {
"vals.forEach(function() { count += 1; });" + var count = 0;
"return count;" + vals.forEach(function(v) { count += v; });
"}" return count;
var result []visits }`
_, err := d.stats.Find(bson.M{}).MapReduce(&mr, &result) var result []Visits
_, err := d.stats.Find(bson.M{"date": bson.M{"$gte": start}}).MapReduce(&mr, &result)
return result, err return result, err
} }

View file

@ -4,6 +4,7 @@ import (
"github.com/gorilla/mux" "github.com/gorilla/mux"
"labix.org/v2/mgo/bson" "labix.org/v2/mgo/bson"
"net/http" "net/http"
"strconv"
"strings" "strings"
"time" "time"
) )
@ -46,13 +47,44 @@ func statsWorker() {
func statsHandler(w http.ResponseWriter, r *http.Request, sess *Session) { func statsHandler(w http.ResponseWriter, r *http.Request, sess *Session) {
var data statsData var data statsData
data.S = GetStatus(w, r) data.S = GetStatus(w, r)
data.Visits, _ = db.GetMonthVisits() data.Daily = getDailyVisits()
loadTemplate(w, "stats", data) loadTemplate(w, "stats", data)
} }
type statsData struct { type statsData struct {
S Status S Status
Visits []visits Daily []visitData
}
type visitData struct {
Label string
Count int
}
func getDailyVisits() []visitData {
const numDays = 30
visits := make([]visitData, numDays)
start := time.Now().Add(-numDays * 24 * time.Hour).Truncate(24 * time.Hour)
visit, _ := db.GetDayVisits(start)
prevDay := start.Day()
i := 0
for _, v := range visit {
day := time.Unix(v.Date/1000, 0).Day()
for prevDay+1 < day {
prevDay++
visits[i].Label = strconv.Itoa(prevDay)
visits[i].Count = 0
i++
}
visits[i].Label = strconv.Itoa(day)
visits[i].Count = v.Count
prevDay = day
i++
}
return visits
} }
func appendFiles(r *http.Request, stats map[string]interface{}) { func appendFiles(r *http.Request, stats map[string]interface{}) {

View file

@ -3,28 +3,26 @@
<script src="/js/Chart.min.js"></script> <script src="/js/Chart.min.js"></script>
<div class="row"> <div class="row">
<div class="span8"> <h4>Daily visits:</h4>
<h4>Visits:</h4> <canvas id="daily" height="400" width="800"></canvas>
<canvas id="visits" height="400"></canvas>
</div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var data = { var data = {
labels : [{{range .Visits}}"{{.Month}}",{{end}}], labels : [{{range .Daily}}"{{.Label}}",{{end}}],
datasets : [ datasets : [
{ {
fillColor : "rgba(151,187,205,0.5)", fillColor : "rgba(151,187,205,0.5)",
strokeColor : "rgba(151,187,205,1)", strokeColor : "rgba(151,187,205,1)",
pointColor : "rgba(151,187,205,1)", pointColor : "rgba(151,187,205,1)",
pointStrokeColor : "#fff", pointStrokeColor : "#fff",
data : [{{range .Visits}}{{.Count}},{{end}}] data : [{{range .Daily}}{{.Count}},{{end}}]
} }
] ]
} }
var ctx = $("#visits").get(0).getContext("2d"); var ctx = $("#daily").get(0).getContext("2d");
new Chart(ctx).Line(data); new Chart(ctx).Line(data);
</script> </script>