diff --git a/models/login_log.go b/models/login_log.go new file mode 100644 index 0000000..b86ade2 --- /dev/null +++ b/models/login_log.go @@ -0,0 +1,36 @@ +package models + +import ( + "time" +) + +// 用户登录日志 + +type LoginLog struct { + Id int `xorm:"pk autoincr notnull "` + Username string `xorm:"varchar(32) notnull"` + Ip string `xorm:"varchar(15) not null"` + Created time.Time `xorm:"datetime notnull created"` + BaseModel `xorm:"-"` +} + +func (log *LoginLog) Create() (insertId int, err error) { + _, err = Db.Insert(log) + if err == nil { + insertId = log.Id + } + + return +} + +func (log *LoginLog) List(params CommonMap) ([]LoginLog, error) { + log.parsePageAndPageSize(params) + list := make([]LoginLog, 0) + err := Db.Desc("id").Limit(log.PageSize, log.pageLimitOffset()).Find(&list) + + return list, err +} + +func (log *LoginLog) Total() (int64, error) { + return Db.Count(log) +} \ No newline at end of file diff --git a/models/migration.go b/models/migration.go index f58752b..4320729 100644 --- a/models/migration.go +++ b/models/migration.go @@ -14,7 +14,7 @@ func (migration *Migration) Exec(dbName string) error { } setting := new(Setting) tables := []interface{}{ - &User{}, &Task{}, &TaskLog{}, &Host{}, setting, + &User{}, &Task{}, &TaskLog{}, &Host{}, setting,&LoginLog{}, } for _, table := range tables { exist, err:= Db.IsTableExist(table) diff --git a/routers/base/base.go b/routers/base/base.go new file mode 100644 index 0000000..da19c74 --- /dev/null +++ b/routers/base/base.go @@ -0,0 +1,20 @@ +package base + +import ( + "gopkg.in/macaron.v1" + "github.com/ouqiang/gocron/models" +) + +func ParsePageAndPageSize(ctx *macaron.Context, params models.CommonMap) { + page := ctx.QueryInt("page") + pageSize := ctx.QueryInt("page_size") + if page <= 0 { + page = 1 + } + if pageSize <= 0 { + pageSize = models.PageSize + } + + params["Page"] = page + params["PageSize"] = pageSize +} \ No newline at end of file diff --git a/routers/host/host.go b/routers/host/host.go index fea4d80..0f656ce 100644 --- a/routers/host/host.go +++ b/routers/host/host.go @@ -11,6 +11,7 @@ import ( "github.com/Unknwon/paginater" "fmt" "html/template" + "github.com/ouqiang/gocron/routers/base" ) func Index(ctx *macaron.Context) { @@ -170,17 +171,7 @@ func parseQueryParams(ctx *macaron.Context) (models.CommonMap) { var params models.CommonMap = models.CommonMap{} params["Id"] = ctx.QueryInt("id") params["Name"] = ctx.QueryTrim("name") - page := ctx.QueryInt("page") - pageSize := ctx.QueryInt("page_size") - if page <= 0 { - page = 1 - } - if pageSize <= 0 { - pageSize = models.PageSize - } - - params["Page"] = page - params["PageSize"] = pageSize + base.ParsePageAndPageSize(ctx, params) return params } \ No newline at end of file diff --git a/routers/loginlog/login_log.go b/routers/loginlog/login_log.go new file mode 100644 index 0000000..1b6e1e2 --- /dev/null +++ b/routers/loginlog/login_log.go @@ -0,0 +1,30 @@ +package loginlog + +import ( + "gopkg.in/macaron.v1" + "github.com/Unknwon/paginater" + "fmt" + "github.com/ouqiang/gocron/modules/logger" + "github.com/ouqiang/gocron/models" + "github.com/ouqiang/gocron/routers/base" + "html/template" +) + +func Index(ctx *macaron.Context) { + loginLogModel := new(models.LoginLog) + params := models.CommonMap{} + base.ParsePageAndPageSize(ctx, params) + total, err := loginLogModel.Total() + loginLogs, err := loginLogModel.List(params) + if err != nil { + logger.Error(err) + } + PageParams := fmt.Sprintf("page_size=%d", params["PageSize"]); + params["PageParams"] = template.URL(PageParams) + p := paginater.New(int(total), params["PageSize"].(int), params["Page"].(int), 5) + ctx.Data["Pagination"] = p + ctx.Data["Title"] = "登录日志" + ctx.Data["LoginLogs"] = loginLogs + ctx.Data["Params"] = params + ctx.HTML(200, "manage/login_log") +} \ No newline at end of file diff --git a/routers/setting/setting.go b/routers/manage/manage.go similarity index 97% rename from routers/setting/setting.go rename to routers/manage/manage.go index 28c7e04..01e37bc 100644 --- a/routers/setting/setting.go +++ b/routers/manage/manage.go @@ -1,4 +1,4 @@ -package setting +package manage import ( "gopkg.in/macaron.v1" @@ -19,7 +19,7 @@ func EditSlack(ctx *macaron.Context) { logger.Error(err) } ctx.Data["Slack"] = slack - ctx.HTML(200, "setting/slack") + ctx.HTML(200, "manage/slack") } func Slack(ctx *macaron.Context) string { @@ -74,7 +74,7 @@ func EditMail(ctx *macaron.Context) { logger.Error(err) } ctx.Data["Mail"] = mail - ctx.HTML(200, "setting/mail") + ctx.HTML(200, "manage/mail") } func Mail(ctx *macaron.Context) string { diff --git a/routers/routers.go b/routers/routers.go index 12021bc..2689417 100644 --- a/routers/routers.go +++ b/routers/routers.go @@ -15,8 +15,9 @@ import ( "github.com/ouqiang/gocron/modules/logger" "github.com/ouqiang/gocron/routers/user" "github.com/go-macaron/gzip" - "github.com/ouqiang/gocron/routers/setting" + "github.com/ouqiang/gocron/routers/manage" "github.com/go-macaron/csrf" + "github.com/ouqiang/gocron/routers/loginlog" ) // 静态文件目录 @@ -68,21 +69,22 @@ func Register(m *macaron.Macaron) { }) // 管理 - m.Group("/setting", func() { + m.Group("/manage", func() { m.Group("/slack", func() { - m.Get("/", setting.Slack) - m.Get("/edit", setting.EditSlack) - m.Post("/url", setting.UpdateSlackUrl) - m.Post("/channel", setting.CreateSlackChannel) - m.Post("/channel/remove/:id", setting.RemoveSlackChannel) + m.Get("/", manage.Slack) + m.Get("/edit", manage.EditSlack) + m.Post("/url", manage.UpdateSlackUrl) + m.Post("/channel", manage.CreateSlackChannel) + m.Post("/channel/remove/:id", manage.RemoveSlackChannel) }) m.Group("/mail", func() { - m.Get("/", setting.Mail) - m.Get("/edit", setting.EditMail) - m.Post("/server", binding.Bind(setting.MailServerForm{}), setting.UpdateMailServer) - m.Post("/user", setting.CreateMailUser) - m.Post("/user/remove/:id", setting.RemoveMailUser) + m.Get("/", manage.Mail) + m.Get("/edit", manage.EditMail) + m.Post("/server", binding.Bind(manage.MailServerForm{}), manage.UpdateMailServer) + m.Post("/user", manage.CreateMailUser) + m.Post("/user/remove/:id", manage.RemoveMailUser) }) + m.Get("/login-log", loginlog.Index) }) // 404错误 diff --git a/routers/task/task.go b/routers/task/task.go index 081dc52..497b06a 100644 --- a/routers/task/task.go +++ b/routers/task/task.go @@ -11,6 +11,7 @@ import ( "github.com/Unknwon/paginater" "fmt" "html/template" + "github.com/ouqiang/gocron/routers/base" ) type TaskForm struct { @@ -242,17 +243,7 @@ func parseQueryParams(ctx *macaron.Context) (models.CommonMap) { status -= 1 } params["Status"] = status - page := ctx.QueryInt("page") - pageSize := ctx.QueryInt("page_size") - if page <= 0 { - page = 1 - } - if pageSize <= 0 { - pageSize = models.PageSize - } - - params["Page"] = page - params["PageSize"] = pageSize + base.ParsePageAndPageSize(ctx, params) return params } diff --git a/routers/tasklog/task_log.go b/routers/tasklog/task_log.go index a8b5975..760e061 100644 --- a/routers/tasklog/task_log.go +++ b/routers/tasklog/task_log.go @@ -8,6 +8,7 @@ import ( "github.com/Unknwon/paginater" "fmt" "html/template" + "github.com/ouqiang/gocron/routers/base" ) // @author qiang.ou @@ -58,17 +59,7 @@ func parseQueryParams(ctx *macaron.Context) (models.CommonMap) { status -= 1 } params["Status"] = status - page := ctx.QueryInt("page") - pageSize := ctx.QueryInt("page_size") - if page <= 0 { - page = 1 - } - if pageSize <= 0 { - pageSize = models.PageSize - } - - params["Page"] = page - params["PageSize"] = pageSize + base.ParsePageAndPageSize(ctx, params) return params } \ No newline at end of file diff --git a/routers/user/user.go b/routers/user/user.go index d00fef0..64e00f5 100644 --- a/routers/user/user.go +++ b/routers/user/user.go @@ -54,12 +54,20 @@ func ValidateLogin(ctx *macaron.Context, sess session.Store) string { if username == "" || password == "" { return json.CommonFailure("用户名、密码不能为空") } - userModel := new (models.User) if !userModel.Match(username, password) { return json.CommonFailure("用户名或密码错误") } + loginLogModel := new(models.LoginLog) + loginLogModel.Username = userModel.Name + loginLogModel.Ip = ctx.RemoteAddr() + _, err := loginLogModel.Create() + if err != nil { + logger.Error("记录用户登录日志失败", err) + } + + sess.Set("username", userModel.Name) sess.Set("uid", userModel.Id) sess.Set("isAdmin", userModel.IsAdmin) diff --git a/templates/common/header.html b/templates/common/header.html index e3d0209..cbcaacc 100644 --- a/templates/common/header.html +++ b/templates/common/header.html @@ -63,7 +63,7 @@ 主机 {{{if gt .LoginUid 0}}} - 配置 + 管理 {{{end}}} diff --git a/templates/manage/login_log.html b/templates/manage/login_log.html new file mode 100644 index 0000000..f50c44c --- /dev/null +++ b/templates/manage/login_log.html @@ -0,0 +1,39 @@ +{{{ template "common/header" . }}} + +
+ {{{ template "manage/menu" . }}} + +
+ + + + + + + + + + + {{{range $i, $v := .LoginLogs}}} + + + + + + {{{end}}} + +
用户名登录IP登录时间
{{{.Username}}}{{{.Ip}}}{{{.Created}}}
+ {{{ template "common/pagination" .}}} +
+
+ + +{{{ template "common/footer" . }}} \ No newline at end of file diff --git a/templates/setting/mail.html b/templates/manage/mail.html similarity index 96% rename from templates/setting/mail.html rename to templates/manage/mail.html index 54561c0..1a98524 100644 --- a/templates/setting/mail.html +++ b/templates/manage/mail.html @@ -1,6 +1,6 @@ {{{ template "common/header" . }}}
- {{{template "setting/menu" .}}} + {{{template "manage/menu" .}}}