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

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

管理员结构体定义

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

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

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

管理员控制器定义

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

1type AdminController struct { 2 //iris框架自动为每个请求都绑定上下文对象 3 Ctx iris.Context 4 5 //admin功能实体 6 Service service.AdminService 7 8 //session对象 9 Session *sessions.Session 10}

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

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

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

管理员数据提供模块定义

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

1func NewAdminService(db *xorm.Engine) AdminService { 2 return &adminSevice{ 3 engine: db, 4 } 5}

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

1/** 2 * 管理员的服务实现结构体 3 */ 4type adminSevice struct { 5 engine *xorm.Engine 6}

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

1func (ac *adminSevice) GetByAdminNameAndPassword(username, password string) (model.Admin, bool) { 2 var admin model.Admin 3 4 ac.engine.Where(" user_name = ? and pwd = ? ", username, password).Get(&admin) 5 6 return admin, admin.AdminId != 0 7}

控制器绑定,路由处理

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

1//启用session 2 sessManager := sessions.New(sessions.Config{ 3 Cookie: "sessioncookie", 4 Expires: 24 * time.Hour, 5 }) 6 7 engine := datasource.NewMysqlEngine() 8 9 //管理员模块功能 10 adminService := service.NewAdminService(engine) 11 12 admin := mvc.New(app.Party("/admin")) 13 admin.Register( 14 adminService, 15 sessManager.Start, 16 ) 17 admin.Handle(new(controller.AdminController))

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

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

在绑定好了控制器处理以后,我们就可以来实现具体的控制器登陆方法中的业务逻辑,具体的登陆逻辑主要如下:

  • 读取请求数据
  • 登陆用户数据校验
  • 根据用户请求数据进行数据库查询
  • 结果判断,返回请求数据

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

1func (ac *AdminController) PostLogin(context iris.Context) mvc.Result { 2 3 var adminLogin AdminLogin 4 ac.Ctx.ReadJSON(&adminLogin) 5 6 //数据参数检验 7 if adminLogin.UserName == "" || adminLogin.Password == "" { 8 return mvc.Response{ 9 Object: map[string]interface{}{ 10 "status": "0", 11 "success": "登录失败", 12 "message": "用户名或密码为空,请重新填写后尝试登录", 13 }, 14 } 15 } 16 17 //根据用户名、密码到数据库中查询对应的管理信息 18 admin, exist := ac.Service.GetByAdminNameAndPassword(adminLogin.UserName, adminLogin.Password) 19 20 //管理员不存在 21 if !exist { 22 return mvc.Response{ 23 Object: map[string]interface{}{ 24 "status": "0", 25 "success": "登录失败", 26 "message": "用户名或者密码错误,请重新登录", 27 }, 28 } 29 } 30 31 //管理员存在 设置session 32 userByte, _ := json.Marshal(admin) 33 ac.Session.Set(ADMIN, userByte) 34 35 return mvc.Response{ 36 Object: map[string]interface{}{ 37 "status": "1", 38 "success": "登录成功", 39 "message": "管理员登录成功", 40 }, 41 } 42}

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

浏览器Post请求

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

{"user_name":"davie","password":"123"} 

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

登陆数据返回

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

{"status":1,"success":"登录成功","message": "管理员登录成功",} 

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

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )