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

一起跳舞吧 等级 403 0 0

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

管理员结构体定义

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

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方法来处理用户登陆请求,具体的路由处理解析规则我们前面已经学习过,登陆处理方法定义如下:

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

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

管理员数据提供模块定义

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

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

当我们需要切换不同的实现时,比如由mysql切换到sqlite,我们只需要修改上述具体的adminService实现就好了,其他都不需要更改,代码改动非常小。
具体到本项目中,我们使用的是mysql数据库,因此我们还需要利用操作数据库来实现AdminService接口中定义的功能方法,在本项目中的管理员的该模块中,实现类我们定义为adminSevice,定义如下:

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

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

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
} 

控制器绑定,路由处理

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

//启用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": "管理员登录成功",} 

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

本文转自 https://blog.csdn.net/qfzhangxu/article/details/89021910,如有侵权,请联系删除。

收藏
评论区

相关推荐

Golang高阶:Golang1.5到Golang1.12包管理
版权所有,转载请注明:http://www.lenggirl.com/go/gomod.html(https://links.jianshu.com/go?tohttp%3A%2F%2Fwww.lenggirl.com%2Fgo%2Fgomod.html) 1. 前言 Golang 是一门到如今有十年的静态高级语言了,2009年的时
Golang指南:顶级Golang框架、IDE和工具列表
自推出以来,Google的Go编程语言(Golang)越来越受主流用户的欢迎。在2016年12月的一份调研中,3,595名受访者中有89%表明他们在工作中或工作以外用Go语言编程。 此外,在编程语言中,Go语言在专业知识和偏好方面排名最高。2017年7月,在Tiobe的年度编程语言排名(https://www.tiobe.com/tiobeindex
【Golang】Golang + jwt 实现简易用户认证
<p本文已同步发布到我的个人博客:<a href"https://links.jianshu.com/go?tohttps%3A%2F%2Fglorin.xyz%2F2019%2F11%2F23%2FGolangjwtsimpleauth%2F" target"_blank"https://glorin.xyz/2019/11/23/Golang
godoc 命令和 golang 代码文档管理
介绍 godoc 是 golang 自带的文档查看器,更多的提供部署服务 go doc 和 godoc 在 golang 1.13 被移除了,可以自行安装 golang.org go1.13 godoc(https://links.jianshu.com/go?tohttps%3A%2F%2Fgolang.org%2Fdoc%2Fg
【读vue 源码】溯源 import Vue from 到底做了什么?
阅读资源 vue.js源码托管地址(https://links.jianshu.com/go?tohttps%3A%2F%2Fgithub.com%2Fvuejs%2Fvue) flow 静态检查工具地址(https://links.jianshu.com/go?tohttps%3A%2F%2Fflow.org%2Fen%2Fdoc
【Golang】Goland使用介绍
goland介绍 Goland官方地址:http://www.jetbrains.com/go/(http://www.jetbrains.com/go/) goland安装 下载 Windows下载地址:https://download.jetbrains.com/go/goland2018.2.1.exe(https://download
mysql安装无法启动问题解决
版本:mysql8.0.12winx64 下载地址:https://dev.mysql.com/downloads/mysql/(https://links.jianshu.com/go?tohttps%3A%2F%2Fdev.mysql.com%2Fdownloads%2Fmysql%2F) 前提 :解压下载的压缩包文件 操作步骤:
Go语言开发的利与弊
Go 语言有多火爆?国外如 Google、AWS、Cloudflare、CoreOS 等,国内如七牛、阿里等都已经开始大规模使用 Go 语言开发其云计算相关产品。在 Go 语言的使用过程中,需要注意哪些 Yes 和 But? 最近,我们使用 Go 语言编写了一个 API,Go 语言是一种开源编程语言,2009 年由 Google 推出。在使用 Go 进行开
深入理解 Go Slice
(https://imghelloworld.osscnbeijing.aliyuncs.com/0ce8a8773a658d4b843e5796a0dbf001.png) image 原文地址:深入理解 Go Slice(https://github.com/EDDYCJY/blog/blob/master/golang/pkg/20
go-map源码简单分析(map遍历为什么时随机的)
GO 中map的底层是如何实现的 首先Go 语言采用的是哈希查找表,并且使用链表解决哈希冲突。 GO的内存模型 先看这一张map原理图 (https://imghelloworld.osscnbeijing.aliyuncs.com/49dfa7b81e19fbab143ddc0a7b3b7fa0.png) map 再来看
go 语言资源整理
Awesome GitHub Topic for Go(https://links.jianshu.com/go?tohttps%3A%2F%2Fgithub.com%2Ftopics%2Fgolang) Awesome Go(https://links.jianshu.com/go?tohttps%3A%2F%2F
我的golang基础
库查询 https://gowalker.org/你应该$HOME/.profile文件增加下面设置。 搭建go的环境 step1:去golang的官网下载go的安装包 windows:go1.9.2.....msi mac:go1.9.2......pkg 双击傻瓜式安装 linux:go1.9.2.linuxamd64.tar.gz 默认到下
Linux环境部署go运行环境并启动项目
第一步、搭建Go生产环境1.下载包 https://golang.org/dl/2.解压(有1.14.4版本了,tar zxvf后回有个go文件夹) cd /usr/local/ wget https://dl.google.com/go/go1.13.6.linuxamd64.tar.gz tar xf go1.13.
GO的执行原理以及GO命令
一、Go的源码文件 Go 的源码文件分类: yuanmawenjian1(https://imghelloworld.osscnbeijing.aliyuncs.com/b50e58692d24232e7d6437
GO定时任务CRON执行不成功?看一下这篇文章就明白了
背景描述碰到一个需求,需要起一个定时任务,由于最近在熟悉go语言,所以想用go来实现这个需求。搜索go定时任务框架,官方推荐的框架是cron,文档地址是https://godoc.org/github.com/robfig/cron官方示例如下 UsageCallers may register Funcs to be invoked on a g

热门文章

Object-C中的内存管理node.js操作CookieChrome 中 Set-Cookie SameSite 问题

最新文章

node.js操作CookieChrome 中 Set-Cookie SameSite 问题Object-C中的内存管理