diff --git a/controllers/base.go b/controllers/base.go index c656c85..76ca9ae 100644 --- a/controllers/base.go +++ b/controllers/base.go @@ -1,25 +1,101 @@ package controllers import ( + "errors" "github.com/astaxie/beego" - "log" + "liteblog/models" ) +const SESSION_USER_KEY = "SESSION_USER_KEY" + type NestPreparer interface { NestPrepare() } type BaseController struct { beego.Controller + IsLogin bool // 标识 用户是否登陆 + User models.User // 登陆的用户 } func (ctx *BaseController) Prepare() { - log.Println("BaseController") - // 判断子类是否实现了NestPreparer接口,如果实现了就调用接口方法。 // 将页面路径保存到path变量中 ctx.Data["Path"] = ctx.Ctx.Request.RequestURI - ctx.Data["Username"] = "xxxx" + // 记录登陆的状态 + ctx.IsLogin = false + tu := ctx.GetSession(SESSION_USER_KEY) + if tu != nil { + if u, ok := tu.(models.User); ok { + ctx.User = u + ctx.Data["User"] = u + ctx.IsLogin = true + } + } + ctx.Data["IsLogin"] = ctx.IsLogin + if app, ok := ctx.AppController.(NestPreparer); ok { app.NestPrepare() } -} \ No newline at end of file +} +// +//func (ctx *BaseController) MustLogin() { +// if !ctx.IsLogin { +// ctx.Abort500(syserrors.NoUserError{}) +// } +//} + +func (ctx *BaseController) GetMustString(key string, msg string) string { + KeyString := ctx.GetString(key, "") + if len(KeyString) == 0 { + ctx.Abort500(errors.New(msg)) + } + return KeyString +} + +func (ctx *BaseController) Abort500(err error) { + ctx.Data["Error"] = err + ctx.Abort("500") +} + +type H map[string]interface{} + +type ResultJsonValue struct { + Code int `json:"code"` + Msg string `json:"msg"` + Action string `json:"action,omitempty"` + Count int `json:"count,omitempty"` + Data interface{} `json:"data,omitempty"` +} + +func (ctx *BaseController) JSONOk(msg string, actions ...string) { + var action string + if len(actions) > 0 { + action = actions[0] + } + ctx.Data["json"] = &ResultJsonValue{ + Code: 0, + Msg: msg, + Action: action, + } + ctx.ServeJSON() +} + +func (ctx *BaseController) JSONOkH(msg string, maps H) { + if maps == nil { + maps = H{} + } + maps["code"] = 0 + maps["msg"] = msg + ctx.Data["json"] = maps + ctx.ServeJSON() +} + +func (ctx *BaseController) JSONOkData(count int, data interface{}) { + ctx.Data["json"] = &ResultJsonValue{ + Code: 0, + Count: count, + Msg: "成功!", + Data: data, + } + ctx.ServeJSON() +} diff --git a/controllers/user.go b/controllers/user.go new file mode 100644 index 0000000..6812bbb --- /dev/null +++ b/controllers/user.go @@ -0,0 +1,38 @@ +package controllers + +import ( + "liteblog/models" + "liteblog/syserrors" + "log" +) + +type UserController struct { + BaseController +} + +// 登陆页面 +// @router /login [get] +func (c *UserController) Login() { + c.TplName = "login.html" +} + +// @router /signin [post] +func (c *UserController) SignIn() { + log.Print("======") + // 判断邮箱不能为空 + email := c.GetMustString("email", "邮箱不能为空") + // 判断密码不能为空 + password := c.GetMustString("password", "密码不能为空") + + var ( + user models.User + err error + ) + + if user, err = models.QueryUserByEmailAndPassword(email, password); err != nil { + c.Abort500(syserrors.NewError("邮箱或密码不对", err)) + } + // 将user保存到session + c.SetSession(SESSION_USER_KEY, user) + c.JSONOk("登陆成功", "/") +} \ No newline at end of file diff --git a/data/session/3/8/382c6bfc04b072ea81ebb02d688f7197 b/data/session/3/8/382c6bfc04b072ea81ebb02d688f7197 new file mode 100644 index 0000000..e22701e Binary files /dev/null and b/data/session/3/8/382c6bfc04b072ea81ebb02d688f7197 differ diff --git a/data/session/9/d/9d124dd27eeae0373eb2117c80a29cb8 b/data/session/9/d/9d124dd27eeae0373eb2117c80a29cb8 new file mode 100644 index 0000000..e22701e Binary files /dev/null and b/data/session/9/d/9d124dd27eeae0373eb2117c80a29cb8 differ diff --git a/main.go b/main.go index 260ae81..03590ed 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,9 @@ package main import ( + "encoding/gob" "github.com/astaxie/beego" + "liteblog/models" _ "liteblog/routers" _ "liteblog/models" "strings" @@ -9,6 +11,7 @@ import ( func main() { initTemplate() + initSession() beego.Run() } @@ -20,5 +23,15 @@ func initTemplate() { }) } +func initSession() { + // beego的session序列号是用gob的方式,因此需要将注册models.User + gob.Register(models.User{}) + // https://beego.me/docs/mvc/controller/session.md + beego.BConfig.WebConfig.Session.SessionOn = true + beego.BConfig.WebConfig.Session.SessionName = "liteblog-key" + beego.BConfig.WebConfig.Session.SessionProvider = "file" + beego.BConfig.WebConfig.Session.SessionProviderConfig = "data/session" +} + diff --git a/models/core.go b/models/core.go index bbed548..c4ee8b3 100644 --- a/models/core.go +++ b/models/core.go @@ -9,8 +9,9 @@ import ( _ "github.com/jinzhu/gorm/dialects/mysql" ) -func init() { - db := initDbConnect() +var db = initDbConnect() + +func init() { //SetMaxOpenConns用于设置最大打开的连接数 //SetMaxIdleConns用于设置闲置的连接数 db.DB().SetMaxIdleConns(10) @@ -39,6 +40,7 @@ func init() { Role: 0, }) } + } func initDbConnect() *gorm.DB { diff --git a/models/user.go b/models/user.go index 352e567..f523631 100644 --- a/models/user.go +++ b/models/user.go @@ -1,6 +1,8 @@ package models -import "github.com/jinzhu/gorm" +import ( + "github.com/jinzhu/gorm" +) type User struct { gorm.Model @@ -9,4 +11,9 @@ type User struct { Avatar string Pwd string Role int `gorm:"default:1"` // 0 管理员 1正常用户 -} \ No newline at end of file +} + +func QueryUserByEmailAndPassword(email, password string) (user User, err error) { + e := db.Model(&User{}).First(&user, "email = ? and pwd = ?", email, password).Error + return user, e +} diff --git a/routers/router.go b/routers/router.go index a152058..ef7291b 100644 --- a/routers/router.go +++ b/routers/router.go @@ -8,5 +8,7 @@ import ( func init() { //beego.Router("/", &controllers.IndexController{}) beego.ErrorController(&controllers.ErrorController{}) - beego.Include(&controllers.IndexController{}) + beego.Include( + &controllers.IndexController{}, + &controllers.UserController{}) } diff --git a/static/js/sysn.js b/static/js/sysn.js new file mode 100644 index 0000000..f21b757 --- /dev/null +++ b/static/js/sysn.js @@ -0,0 +1,88 @@ +/** + @Name:layui.sysn + */ +layui.define(['jquery', 'layer'], function (exports) { + var $ = layui.jquery, + layer = layui.layer, + ajaxObj = {}, + sysn = {}; + + function ajax(url, type, timeout, data, success, error, complete) { + var error2 = function (ret) { + var msg = ret.responseText || ret.msg||ret; + if (ret.status != undefined && ret.status == 0) { + msg = "网络异常"; + } + if (!error) { + sysn.sayError(msg); + } else { + error(msg) + } + }; + $.ajax({ + url: url, + type: type, + timeout: timeout || 5000, + data: data, + success: function (ret) { + if (ret.code == 0) { + success(ret) + } else { + error2(ret) + } + }, + error: error2, + complete: complete + }); + } + + + sysn.get = function (url, data) { + ajaxObj.url = url; + ajaxObj.data = data; + ajaxObj.method = "GET"; + return this; + }; + + + sysn.post = function (url, data) { + ajaxObj.url = url; + ajaxObj.data = data; + ajaxObj.method = "POST"; + return this; + }; + + sysn.success = function (success) { + ajaxObj.success = success; + return this; + }; + + sysn.error = function (error) { + ajaxObj.error = error; + return this; + }; + + sysn.complete = function (complete) { + ajaxObj.complete = complete; + return this; + }; + + sysn.run = function () { + ajax(ajaxObj.url, ajaxObj.method, ajaxObj.timeout, ajaxObj.data, ajaxObj.success, ajaxObj.error, ajaxObj.complete); + }; + + sysn.sayOk = function (msg) { + layer.msg(msg, {icon: 6}); + }; + sysn.sayError = function (msg) { + layer.msg(msg, {icon: 5}) + }; + + sysn.setTimeout = function (timeout) { + ajaxObj.timeout = timeout; + return this; + }; + + //输出test接口 + exports('sysn', sysn); +}); \ No newline at end of file diff --git a/syserrors/errors.go b/syserrors/errors.go new file mode 100644 index 0000000..b5a330a --- /dev/null +++ b/syserrors/errors.go @@ -0,0 +1,14 @@ +package syserrors + +type Error interface { + Error() string + Code() int + ReasonError() error +} + +func NewError(msg string, err2 error) UnKnowError { + err := UnKnowError{} + err.msg = msg + err.reason = err2 + return err +} \ No newline at end of file diff --git a/syserrors/unknow.go b/syserrors/unknow.go new file mode 100644 index 0000000..265e4c8 --- /dev/null +++ b/syserrors/unknow.go @@ -0,0 +1,22 @@ +package syserrors + +type UnKnowError struct { + msg string + reason error +} + +func (err UnKnowError) Error() string { + if len(err.msg) == 0 { + return "未知错误" + } else { + return err.msg + } +} + +func (err UnKnowError) Code() int { + return 1000 +} + +func (err UnKnowError) ReasonError() error { + return err.reason +} \ No newline at end of file diff --git a/views/login.html b/views/login.html new file mode 100644 index 0000000..de9fb28 --- /dev/null +++ b/views/login.html @@ -0,0 +1,83 @@ + + + + + 关于-闲言轻博客 + + {{ template "shares/link.html". }} + + + +{{ template "shares/header.html". }} +
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+ + 注册用户 +
+
+
+
+
+
+
+
+{{ template "shares/footer.html". }} + + + \ No newline at end of file diff --git a/views/reg.html b/views/reg.html new file mode 100644 index 0000000..aaba832 --- /dev/null +++ b/views/reg.html @@ -0,0 +1,61 @@ + + + + + 关于-闲言轻博客 + + {{ template "shares/link.html". }} + + +{{ template "shares/header.html". }} +
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
+
+
+
+{{ template "shares/footer.html". }} + + \ No newline at end of file