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

栏目: Go · 发布时间: 7年前

内容简介:登录和退出的流程:首先,我们需要开启 session,在文件 app.conf 中加入如果未开启直接访问session可能会报如下错误:

登录和退出的流程:

  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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Linux集群体系结构

Linux集群体系结构

Alex Vrenios / 马朝晖 / 机械工业出版社 / 2003-1 / 38.00元

本书对Linux集群体系结构的硬件环境组建与其软件开发作了深入细致的介绍。通过阅读本书,可以对Linux集群体系结构有深入的认识,掌握并了解如何设计和构造集群计算机。本书使你了解到开发项目可能遇到的问题,并掌握测试和调整分布式算法。 本书适合计算机系统集成技术人员、管理人员和计算机科研人员作为参考。一起来看看 《Linux集群体系结构》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具