手摸手教你用beego实现留言本之三(实现登录和退出)

wujiangwei · 2019-01-15 11:16:01 · 1315 次点击 · 预计阅读时间 5 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-01-15 11:16:01 的文章,其中的信息可能已经有所发展或是发生改变。

登录和退出的流程:

  1. 输入用户名、密码传到后台
  2. 数据库查询结果是否匹配
  3. 匹配成功保存 session 跳转首页
  4. 退出登录 删除session 这里用到了beego的三个知识点:session | 数据库查询 | 跳转

1. 设置session

首先,我们需要开启 session,在文件 app.conf 中加入

sessionon = true

如果未开启直接访问session可能会报如下错误:

goblog:runtime error: invalid memory address or nil pointer dereference

1.1 设置session

这里提到的变量 c 即是控制器中传入的指针对象

c.SetSession("Username","bego")

1.2 获取session

c.GetSession("Username")

1.3 删除session

c.DelSession("Username")

session的详细讲解参见:https://www.kancloud.cn/hello123/beego/126126

2. 跳转重定向

我们查询到 beego 的跳转在控制器中已经封装好了,直接调用就好

func (c *MainController) Get() {
    username := c.GetSession("Username")
    if username == nil {
        c.Redirect("/user/login",302)
        return
    }
    //other code
}

更多细节参见跳转重定向:https://www.kancloud.cn/hello123/beego/126123

3. 数据库读取

这里我们用到了 ormRead 方法,需要一个'User' 指针,并使用字段 namepassword 匹配

func (user User) GerOne() (int,error) {
    orm.Debug = true
    o := orm.NewOrm()
    if err := o.Read(&user,"name","password"); err != nil || user.Id <= 0 {
        return 0, errors.New("用户名或密码错误")
    } else {
        return user.Id,nil
    }
}

更多数据库查询细节参见:https://www.kancloud.cn/hello123/beego/126104

4. 代码实例(核心部分)

4.1 访问首页

路由

beego.Router("/", &controllers.MainController{})

模板

<div class="description">
    欢迎回来,{{.Username}} <button class="btn btn-default" onclick="logout()">退出</button>
  </div>
  <script>
  //登出功能
  function logout(){
    $.ajax({
      type:'post',
      url:'/user/logout',
      data:{},
      success:function(result){
        if(result.State > 0){
          alert(result.Message)
        }else {
          alert("退出成功");
          location.href = "/"
        }
      }
    })
  }
</script>

控制器

func (c *MainController) Get() {
    username := c.GetSession("Username")
    if username == nil {
        c.Redirect("/user/login",302)
        return
    }
    c.Data["Username"] = username
    c.TplName = "index.tpl"
}

4.2 登录页

路由

beego.Router("/user/login", &controllers.UserController{},"get:Login")
beego.Router("/user/sign", &controllers.UserController{},"post:Sign")
beego.Router("/user/logout", &controllers.UserController{},"post:Logout")

模板

 <div class="container">
    <div class="form-group">
        <label for="text">用户名:</label>
        <input type="text" class="form-control" id="name" placeholder="用户名">
    </div>
    <div class="form-group">
        <label for="text">密码:</label>
        <input type="password" class="form-control" id="password" placeholder="密码">
    </div>
    <div class="form-group">
        <button class="btn btn-primary" onclick="login()">登陆</button>
        <button class="btn btn-primary" onclick="register()">注册</button>
    </div>
</div>
<script type="text/javascript">
    //登陆功能
    function login(){
        $.ajax({
            type:'post',
            url:'/user/sign',
            data:{
                "name":$("#name").val(),
                "password":$("#password").val()
            },
            success:function(result){
                if(result.State > 0){
                    alert(result.Message)
                }else {
                    alert("登录成功");
                    location.href = "/"
                }
            }
        })
    }

    function register() {
        location.href = "/user/register"
    }
</script>

控制器

func (c *UserController) Login() {
    c.TplName = "login.tpl"
}

func (c *UserController) Sign() {
    user := models.User{}
    user.Name = c.Input().Get("name")
    user.Password = c.Input().Get("password")

    response := ResponseJson{State:0,Message:"ok"}
    if user.Name == "" || user.Password == ""{
        response.State = 500
        response.Message = "用户名或密码不能为空"
    }else {
        if id,err := user.GerOne(); err != nil || id == 0 {
            response.State = 500
            response.Message = err.Error()
        } else {
            c.SetSession("Username",user.Name)
        }
    }
    c.Data["json"] = response
    c.ServeJSON()
}


func (c *UserController) Logout() {
    c.DelSession("Username")
    response := ResponseJson{State:0,Message:"ok"}
    c.Data["json"] = response
    c.ServeJSON()
}

模型

/**
   查询单个用户信息
 */
func (user User) GerOne() (int,error) {
    orm.Debug = true
    o := orm.NewOrm()
    if err := o.Read(&user,"name","password"); err != nil || user.Id <= 0 {
        return 0, errors.New("用户名或密码错误")
    } else {
        return user.Id,nil
    }
}

项目所在github地址:https://github.com/wujiangweiphp/beegostudy


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1315 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传