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

管理员结构体定义

首先我们要定义管理员这个实体的结构体,我们定义为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": "管理员登录成功",}

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

Go语言学习教程:管理员登录功能开发的更多相关文章

  1. JFinal使用笔记3-注册和登录功能开发记录

    首页 开源项目 问答 代码 博客 翻译 资讯 移动开发 招聘 城市圈 当前访客身份:游客 [ 登录 | 加入开源中国 ]   当前访客身份: 游客 [ 登录 | 加入开源中国 ] 软件   土龙 关注 ...

  2. Android学习笔记_65_登录功能本身没有任何特别

    对于登录功能本身没有任何特别,使用httpclient向服务器post用户名密码即可.但是为了保持登录的状态(在各个Activity之间切换时要让网站知道用户一直是处于登录的状态)就需要进行cooki ...

  3. C语言学习笔记(一) 开发环境的搭建

    写这个系列的原因是因为最近在学习C语言,记录博客会让自己能够更好的掌握学习到的东西.编程贵在坚持,每天改变一丢丢! C语言开发两个软件,一个是文本编辑工具,Notepad++或者是EditPlus都可 ...

  4. Go语言学习_Win10下安装Go开发环境

    关于Go语言有多么值得学习,这里就不做介绍了,既然看了这篇文章,想必是对有学习意向. 这里是在Windows下安装Go环境,去中文社区的下载栏目,https://studygolang.com/dl ...

  5. Go语言学习教程:xorm表基本操作及高级操作

    在上节内容中,我们介绍了xorm框架表结构的映射规则和表结构的操作.本节课,继续来深入学习表结构基本操作和高级查询的相关功能. 表结构基本操作 对表结构的操作最常见的操作是查询和统计相关的方法,我们首 ...

  6. go语言学习之路 一:开发环境配置

    1. 安装go 1)下载地址:http://www.golangtc.com/download,下载后直接双击msi文件安装,默认安装在c:\go 2)安装完成后默认会在环境变量 Path 后添加 G ...

  7. 推荐一个C语言学习教程

    Linux C编程一站式学习 http://learn.akae.cn/media/index.html

  8. Node.js基础学习三之登录功能

    本篇介绍Node.js访问数据库并返回数据给客户端 需求基于Node.js学习(二) 数据库请下载:user.sql 1.创建user 实体类(model-user.js) function User ...

  9. Go语言学习之15 商品秒杀开发与接入层实现

    outline 1. 秒杀抢购接入层实现2. 秒杀逻辑层实现 秒杀接入层核心功能 秒杀逻辑层核心功能 SecKill接口 /seckill?product=20&source=android& ...

随机推荐

  1. ArcGis教程

    91卫图助手帮助中心-如何导出ArcGIS Server瓦片格式并进行发布 http://help.91weitu.com/rhdcarcgis%20serverwpgsbjxfb.html ArcG ...

  2. VerilogHDL编译预处理

    编译预处理语句 编译预处理是VerilogHDL编译系统的一个组成部分,指编译系统会对一些特殊命令进行预处理,然后将预处理结果和源程序一起在进行通常的编译处理.以”`” (反引号)开始的某些标识符是编 ...

  3. Java-API:java.util.Date

    ylbtech-Java-API:java.util.Date Module java.base Package java.util Class Date java.lang.Object java. ...

  4. jenkins学习 03 jenkins配置Maven项目

    我们的产品使用Git作为版本管理工具,而jenkins需要git插件来支持git,所以我们需要为jenkins添加git插件. 在Available tab页中找到Git Plugin 点击下方的In ...

  5. .Net 之Tuple 类

    Tuple是什么 按照Msdn 上说:提供用于创造元组对象的静态方法.从字面意思并不能理解他的作用:   Tuple 是个静态类,提供8个静态泛型方法:T 可以是值类型,也可是引用类型:   使用场景 ...

  6. C Primer Plus学习笔记(一)- C语言概述

    从一个简单的C语言程序开始 #include <stdio.h> /*这是一个简单的C语言程序*/ //注释 int main(void) { int num; num = 1; prin ...

  7. java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结

    在web开发中,避免不了对日期的操作,就几种常见的日期操作做个总结(部分参考网络,在此表示感谢): java.util.Date.java.sql.Date.java.sql.Time.java.sq ...

  8. DDD学习笔录——领域驱动设计的常见误区(即错误的理解)

    可以将DDD看成一种开发思想体系:它促成了一种新的以领域为中心的思维方式. 它是一种学习过程,而非最终目标,这就是DDD的最大优势. 任何团队都可以编写一个软件来满足一组用例的需求,但那些将时间和精力 ...

  9. 昨天的笔试题, StringBuffer

    代码: public static void switchStr(StringBuffer x, StringBuffer y) { x.append(y); System.out.println(& ...

  10. android tween动画和Frame动画总结

    tween  动画有四种 //透明度动画 AlphaAnimation aa = (AlphaAnimation) AnimationUtils.loadAnimation(MainActivity. ...