> 登录和退出的流程:
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` 即是控制器中传入的指针对象
```go
c.SetSession("Username","bego")
```
#### 1.2 获取session
```go
c.GetSession("Username")
```
#### 1.3 删除session
```go
c.DelSession("Username")
```
session的详细讲解参见:https://www.kancloud.cn/hello123/beego/126126
### 2. 跳转重定向
> 我们查询到 beego 的跳转在控制器中已经封装好了,直接调用就好
```go
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` 匹配
```go
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 访问首页
路由
```go
beego.Router("/", &controllers.MainController{})
```
模板
```html
<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>
```
控制器
```go
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 登录页
路由
```go
beego.Router("/user/login", &controllers.UserController{},"get:Login")
beego.Router("/user/sign", &controllers.UserController{},"post:Sign")
beego.Router("/user/logout", &controllers.UserController{},"post:Logout")
```
模板
```html
<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>
```
控制器
```go
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()
}
```
模型
```go
/**
查询单个用户信息
*/
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
有疑问加站长微信联系(非本文作者))