學習完了數據庫操做的知識之後。本節內容,咱們將實現管理員登錄功能,涉及到多個模塊的代碼實現和邏輯處理,以及數據庫表的操做,都將在本節內容中進行實現。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的登錄請求,攜帶的用戶數據是json格式,以下:
{"user_name":"davie","password":"123"}複製代碼
在真實的生產環境中,密碼和用戶敏感的數據是要通過加密或者脫敏處理的,這裏咱們是案例講解,直接進行傳遞,這一點須要你們注意到與實際生產環境的區別。
在controller的PostLogin方法中已經有返回數據。登錄請求的返回數據是json格式,若是登錄成功,會有以下返回格式:
{"status":1,"success":"登陸成功","message": "管理員登陸成功",}複製代碼
本節內容,咱們開發完成了管理員登錄功能的開發,下節課將繼續進行管理員模塊的其餘功能的開發。