Go语言学习教程:管理员登陆功能开发

学习完了数据库操做的知识之后。本节内容,咱们将实现管理员登录功能,涉及到多个模块的代码实现和逻辑处理,以及数据库表的操做,都将在本节内容中进行实现。mysql

管理员结构体定义

首先咱们要定义管理员这个实体的结构体,咱们定义为Admin:sql

type Admin struct {
    //若是field名称为Id,并且类型为int64,并无定义tag,则会被xorm视为主键,而且拥有自增属性
    AdminId    int64     `xorm:"pk autoincr" json:"id"` //主键 自增
    AdminName  string    `xorm:"varchar(32)" json:"admin_name"`
    CreateTime time.Time `xorm:"DateTime" json:"create_time"`
    Status     int64     `xorm:"default 0" json:"status"`
    Avatar     string    `xorm:"varchar(255)" json:"avatar"`
    Pwd        string    `xorm:"varchar(255)" json:"pwd"`      //管理员密码
    CityName   string    `xorm:"varchar(12)" json:"city_name"` //管理员所在城市名称
    CityId     int64     `xorm:"index" json:"city_id"`
    City       *City     `xorm:"- <- ->"` //所对应的城市结构体(基础表结构体)
}复制代码

在Admin结构体定义中,咱们经过Tag中的xorm限定来制定各个结构体字段的类型,使用json来限定在进行JSON数据序列化时定义的json字段。数据库

管理员控制器定义

咱们使用mvc包模式来进行功能开发,在进行告终构体定义之后,咱们接着定义控制器。控制器负责来完成咱们请求的逻辑流程控制,是咱们功能开发的核心枢纽。在本项目中,咱们按照模块化的结构进行功能开发,本节内容中的管理员登录就属于管理员模块。AdminController定义以下:编程

type AdminController struct {
    //iris框架自动为每一个请求都绑定上下文对象
    Ctx iris.Context
​
    //admin功能实体
    Service service.AdminService
​
    //session对象
    Session *sessions.Session
}复制代码

在AdminController定义中,包含iris.Context上下文处理对象,用于数据功能处理的管理员模块功能实现AdminService,还有用于session管理的对象。 定义PostLogin方法来处理用户登录请求,具体的路由处理解析规则咱们前面已经学习过,登录处理方法定义以下:json

//接口:/admin/login
//请求:Post
func (ac *AdminController) PostLogin(context iris.Context) mvc.Result {
......
}复制代码

这里只给出控制器的请求处理的方法定义,具体逻辑,咱们后面会详细讲。浏览器

管理员数据提供模块定义

在咱们实际的开发过程当中,咱们每每将数据提供服务模块设计成接口,这样设计的目的是接口定义和具体的功能编程实现了分离,有助于咱们在不一样的实现方案之间进行切换,成本很是小,以下图:bash

func NewAdminService(db *xorm.Engine) AdminService {
    return &adminSevice{
        engine: db,
    }
}复制代码

当咱们须要切换不一样的实现时,好比由mysql切换到sqlite,咱们只须要修改上述具体的adminService实现就行了,其余都不须要更改,代码改动很是小。 具体到本项目中,咱们使用的是mysql数据库,所以咱们还须要利用操做数据库来实现AdminService接口中定义的功能方法,在本项目中的管理员的该模块中,实现类咱们定义为adminSevice,定义以下:cookie

/**
 * 管理员的服务实现结构体
 */
type adminSevice struct {
    engine *xorm.Engine
}复制代码

经过用户名和密码查询特定的管理员的方法实现:session

func (ac *adminSevice) GetByAdminNameAndPassword(username, password string) (model.Admin, bool) {
    var admin model.Admin
​
    ac.engine.Where(" user_name = ? and pwd = ? ", username, password).Get(&admin)
​
    return admin, admin.AdminId != 0
}复制代码

控制器绑定,路由处理

管理员结构体,控制器和功能逻辑实现了之后,咱们须要在程序入口处作控制器绑定,指定咱们定义的管理员控制器进行路由处理,具体的绑定操做以下:mvc

//启用session
    sessManager := sessions.New(sessions.Config{
        Cookie:  "sessioncookie",
        Expires: 24 * time.Hour,
    })
​
    engine := datasource.NewMysqlEngine()
​
    //管理员模块功能
    adminService := service.NewAdminService(engine)
​
    admin := mvc.New(app.Party("/admin"))
    admin.Register(
        adminService,
        sessManager.Start,
    )
    admin.Handle(new(controller.AdminController))复制代码

在上述代码中,咱们启用了session,而后经过mvc的Handle方法进行控制器的指定。

登陆功能方法解析,数据库查询

在绑定好了控制器处理之后,咱们就能够来实现具体的控制器登录方法中的业务逻辑,具体的登录逻辑主要以下:

  • 读取请求数据

  • 登录用户数据校验

  • 根据用户请求数据进行数据库查询

  • 结果判断,返回请求数据

根据上述的逻辑进行编码实现,完整的登录方法逻辑实现以下:

func (ac *AdminController) PostLogin(context iris.Context) mvc.Result {
​
    var adminLogin AdminLogin
    ac.Ctx.ReadJSON(&adminLogin)
​
    //数据参数检验
    if adminLogin.UserName == "" || adminLogin.Password == "" {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  "0",
                "success": "登陆失败",
                "message": "用户名或密码为空,请从新填写后尝试登陆",
            },
        }
    }
​
    //根据用户名、密码到数据库中查询对应的管理信息
    admin, exist := ac.Service.GetByAdminNameAndPassword(adminLogin.UserName, adminLogin.Password)
​
    //管理员不存在
    if !exist {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  "0",
                "success": "登陆失败",
                "message": "用户名或者密码错误,请从新登陆",
            },
        }
    }
​
    //管理员存在 设置session
    userByte, _ := json.Marshal(admin)
    ac.Session.Set(ADMIN, userByte)
​
    return mvc.Response{
        Object: map[string]interface{}{
            "status":  "1",
            "success": "登陆成功",
            "message": "管理员登陆成功",
        },
    }
}复制代码

须要注意的是,该请求处理方法中,除了包含业务逻辑处理之外,咱们还使用了session实现了用户状态的存储。

浏览器Post请求

全部的代码编程部分,咱们已经实现。能够经过启动项目,进行登录请求调试。在浏览器中输入用户名和密码,便可使用开发者工具查看,咱们这里浏览器发送的Post的登录请求,携带的用户数据是json格式,以下:

{"user_name":"davie","password":"123"}复制代码

在真实的生产环境中,密码和用户敏感的数据是要通过加密或者脱敏处理的,这里咱们是案例讲解,直接进行传递,这一点须要你们注意到与实际生产环境的区别。

登录数据返回

在controller的PostLogin方法中已经有返回数据。登录请求的返回数据是json格式,若是登录成功,会有以下返回格式:

{"status":1,"success":"登陆成功","message": "管理员登陆成功",}复制代码

本节内容,咱们开发完成了管理员登录功能的开发,下节课将继续进行管理员模块的其余功能的开发。

相关文章
相关标签/搜索