登录和退出的流程:
- 输入用户名、密码传到后台
- 数据库查询结果是否匹配
- 匹配成功保存 session 跳转首页
- 退出登录 删除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. 数据库读取
这里我们用到了
orm
的Read
方法,需要一个'User' 指针,并使用字段name
、password
匹配
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
有疑问加站长微信联系(非本文作者))
