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": "管理員登陸成功",}複製代碼

本節內容,咱們開發完成了管理員登錄功能的開發,下節課將繼續進行管理員模塊的其餘功能的開發。

相關文章
相關標籤/搜索