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

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

内容简介:登录和退出的流程:首先,我们需要开启 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


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

查看所有标签

猜你喜欢:

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

Web开发权威指南

Web开发权威指南

[美] Chris Aquino,、[美] Todd Gandee / 奇舞团 / 人民邮电出版社 / 2017-9 / 99.00元

本书在知名培训机构Big Nerd Ranch 培训教材的基础上编写而成,囊括了JavaScript、HTML5、CSS3等现代前端开发人员急需的技术关键点,包括响应式UI、访问远程Web 服务、用Ember.js 构建应用,等等。此外,还会介绍如何使用前沿开发工具来调试和测试代码,并且充分利用Node.js 和各种开源的npm 模块的强大功能来进行开发。 全书分四部分,每部分独立完成一个项......一起来看看 《Web开发权威指南》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器