Beego框架:部落格後臺登入,使用者,說說等功能實現
#後臺登入
後臺登入頁面效果圖如下:
該頁面主要實現登入功能,在使用者輸入對應的資料並點選登入按鈕的時候,在後臺獲取對應的資訊,根據賬號在資料庫中查詢資料,如果沒有該使用者或出現其他錯誤會在前臺給與對應的提示。如果使用者勾選了記住一週需要將使用者登入的資訊儲存到cookie中,並設定cookie的存活時間為一週。
func (this *AccountController) Login() { //判斷該請求是不是通過點選點選登入按鈕傳遞過來的 if this.GetString("dosubmit") == "yes" { //獲取賬號並去除兩邊的空格 account := strings.TrimSpace(this.GetString("account")) //獲取密碼並去除兩邊的空格 password := strings.TrimSpace(this.GetString("password")) //獲取是否記住一週並去除兩邊的空格 remember := strings.TrimSpace(this.GetString("remember")) //判斷賬號和密碼是否為空 if account != "" && password != "" { //建立使用者結構體 var user = &models.User{} //將獲取到的賬號賦值給結構體 user.Username = account //根據賬號查詢使用者,並且判斷查詢到的密碼和使用者輸入的密碼通過MD5雜湊之後的結果是否一樣 if user.Read("username") != nil || user.Password != models.Md5([]byte(password)) { this.Data["errmsg"] = "賬號或密碼錯誤!" }else if user.Active == 0 {//判斷該賬戶是否啟用 this.Data["errmsg"] = "該賬號尚未啟用!" }else { //登入次數加一 user.Logincount += 1 //更新登入次數 user.Update("logincount") //對密碼進行雜湊 authkey := models.Md5([]byte(password)) //判斷使用者是否勾選了記住一週 if remember == "yes" { //設定一個存活一週的cookie this.Ctx.SetCookie("auth", strconv.Itoa(user.Id) + "|" + authkey, 60*60*24*7) }else { //設定一個cookie,預設存活3600秒 this.Ctx.SetCookie("auth", strconv.Itoa(user.Id) + "|" + authkey) } //重定向,網址A隨時有可能改主意,重新顯示本身的內容或轉向其他的地方 this.Redirect("/admin", 302) } } } //設定模板名稱 this.TplName = "admin/account_login.html" }
#系統資訊
效果圖如下:
該頁面主要實現了系統資訊以及部落格系統中的一些主要資訊。
func (this *IndexController) Index() { this.display() //主機名稱 this.Data["hostname"], _ = os.Hostname() //go語言版本 this.Data["gover"] = runtime.Version() //作業系統 this.Data["os"] = runtime.GOOS //處理器架構,例如:amd64(x64):64位處理器,x32:32位處理器 this.Data["arch"] = runtime.GOARCH //cpu數量 this.Data["cpunum"] = runtime.NumCPU() //文章數量 this.Data["postnum"], _ = orm.NewOrm().QueryTable(new(models.Post)).Count() //分類數量 this.Data["tagnum"], _ = orm.NewOrm().QueryTable(new(models.Tag)).Count() //使用者數量 this.Data["usernum"], _ = orm.NewOrm().QueryTable(new(models.User)).Count() }
#使用者管理
效果圖如下:
使用者管理模組主要實現了使用者的刪除,編輯,新增等功能。
##新增使用者
效果圖如下:
在該頁面使用者填寫完相應的資訊之後點選儲存按鈕,將資料提交到後臺,在後臺會通過validation檢查使用者輸入的資料是否合法,如果使用者輸入的資料不合法,將對應的提示資訊存入模板資料中在前臺頁面展示。如果使用者輸入的資料合法,例如:輸入的使用者名稱在資料庫中不存在,將對應的資訊插入資料庫中。
func (this *UserController) Add() { //建立map,用於錯誤回顯 input := make(map[string]string) //建立map,用於儲存提示資訊 errmsg := make(map[string]string) //判斷該請求方式是不是post請求方式 if this.Ctx.Request.Method == "POST" { //獲取使用者名稱,並去除兩邊的空格 username := strings.TrimSpace(this.GetString("username")) //獲取密碼,並去除兩邊的空格 password := strings.TrimSpace(this.GetString("password")) //獲取重新輸入的密碼,並去除兩邊的空格 password2 := strings.TrimSpace(this.GetString("password2")) //獲取郵箱,並去除兩邊的空格 email := strings.TrimSpace(this.GetString("email")) //獲取是否啟用 active, _ := this.GetInt("active") //設定使用者名稱 input["username"] = username //設定密碼 input["password"] = password //設定確認密碼 input["password2"] = password2 //設定郵箱 input["email"] = email //建立validation物件,用於判斷輸入資料是否合法 valid := validation.Validation{} //判斷使用者名稱是否為空 if result := valid.Required(username, "username"); !result.Ok { errmsg["username"] = "請輸入使用者名稱!" //判斷使用者名稱的最大長度是否超過15個字元 }else if result := valid.MaxSize(username, 15, "username"); !result.Ok { errmsg["username"] = "使用者名稱長度不能大於15個字元!" } //判斷密碼是否為空 if result := valid.Required(password, "password"); !result.Ok { errmsg["password"] = "請輸入密碼!" } //判斷重新輸入的密碼是否為空 if result := valid.Required(password2, "password2"); !result.Ok { errmsg["password2"] = "請再次輸入密碼!" }else if password != password2 {//判斷兩次輸入的密碼是否相等 errmsg["password2"] = "兩次輸入的密碼不一致!" } //判斷郵箱是否為空 if result := valid.Required(email, "email"); !result.Ok { errmsg["email"] = "請輸入email地址!" //判斷輸入的郵箱是否合法 }else if result := valid.Email(email, "email"); !result.Ok { errmsg["email"] = "Email無效!" } //如果active大於0,設定預設值為1 if active > 0 { active = 1 }else { //否者設定預設值為0 active = 0 } //判斷提示資訊是否為空 if len(errmsg) == 0 { //建立使用者結構體 var user = &models.User{} //設定使用者名稱 user.Username = username //設定密碼 user.Password = models.Md5([]byte(password)) //設定郵箱 user.Email = email //設定是否啟用 user.Active = active //插入使用者 if err := user.Insert(); err != nil { this.showmsg(err.Error()) } //重定向到使用者列表 this.Redirect("/admin/user/list", 302) } } this.Data["input"] = input this.Data["errmsg"] = errmsg this.display() }
##編輯使用者
效果圖如下:
該頁面主要是修改使用者的密碼和郵箱以及啟用狀態,使用者名稱不允許修改,因為要保證資料庫中的使用者名稱是唯一的,使用者在修改完對應的資訊之後點選儲存,在後臺判斷資料的合法資訊,如果通過驗證更新資料庫中對應的記錄,否則將對應的提示資訊在前臺頁面展示。
func (this *UserController) Edit() {
//獲取使用者id
id, _ := this.GetInt("id")
//建立結構體並初始化id
user := &models.User{Id:id}
//通過id查詢使用者
if err := user.Read(); err != nil {
this.showmsg("使用者不存在!")
}
//建立map,用於儲存錯誤資訊
errmsg := make(map[string]string)
//判斷該請求方式是否是post請求方式
if this.Ctx.Input.Method() == "POST" {
//獲取密碼,並去除兩邊的空格
password := strings.TrimSpace(this.GetString("password"))
//獲取確認密碼,並去除兩邊的空格
password2 := strings.TrimSpace(this.GetString("password2"))
//獲取郵箱,並去除兩邊的空格
email := strings.TrimSpace(this.GetString("email"))
//獲取是否啟用
active, _ := this.GetInt("active")
//建立validateion物件
valid := validation.Validation{}
//判斷密碼是否為空
if password != "" {
//判斷確認密碼是否為空
if request := valid.Required(password2, "password2"); !request.Ok {
errmsg["password2"] = "請再次輸入密碼!"
}else if password != password2 {//判斷兩次輸入的密碼是否一致
errmsg["password2"] = "兩次輸入的密碼不一致!"
}else {
//設定密碼
user.Password = models.Md5([]byte(password))
}
}
//判斷郵箱是否為空
if result := valid.Required(email, "email"); !result.Ok {
errmsg["email"] = "請輸入Email地址!"
//判斷輸入的郵箱格式是否正確
}else if result := valid.Email(email, "email"); !result.Ok {
errmsg["email"] = "Email無效!"
}else {
//設定郵箱
user.Email = email
}
//判斷active是否大於0
if active > 0 {
user.Active = 1
}else {
user.Active = 0
}
//判斷是否存在提示資訊
if len(errmsg) == 0 {
//更新使用者
user.Update()
//重定向,網址A隨時有可能改主意,重新顯示本身的內容或轉向其他的地方
this.Redirect("/admin/user/list", 302)
}
}
this.Data["user"] = user
this.Data["errmsg"] = errmsg
this.display()
}
##刪除使用者
效果圖如下:
使用者在點選刪除按鈕的時候會給與相應的刪除提示,該操作需要謹慎操作,因為資料一旦刪除無法恢復。在使用者確定刪除之後,將對應的id傳遞到後臺,然後在資料庫中根據該id將對應的記錄從資料庫中刪除,刪除成功重定向到使用者列表頁面,否則給與對應的錯誤提示。
func (this *UserController) Delete() {
//獲取使用者id
id, _ := this.GetInt("id")
//判斷使用者id是否為7,預設id為7的為超級管理員
if id == 7 {
this.showmsg("不能刪除ID為7的使用者!")
}
//建立使用者結構體並初始化id
user := &models.User{Id:id}
//通過id查詢使用者
if user.Read() == nil {
//刪除使用者
user.Delete()
}
//重定向,網址A隨時有可能改主意,重新顯示本身的內容或轉向其他的地方
this.Redirect("/admin/user/list", 302)
}
#友鏈管理
效果圖如下:
在友鏈管理頁面主要實現了友情連結的展示,編輯,刪除,新增等功能。
##友鏈新增
效果圖如下:
該頁面主要實現友鏈的新增,使用者在填寫完對應的資訊並點選儲存按鈕之後將資料提交到後臺,在後臺將接收資料並將資料插入友情連結表中,其中的排序值表示友情連結的展示順序,排序值越大排的越靠前。
func (this *LinkController) Add() {
//判斷該請求方式是不是post請求方式
if this.Ctx.Request.Method == "POST" {
//獲取網站名稱
sitename := this.GetString("sitename")
//獲取網址
url := this.GetString("url")
//獲取排序等級(值越大越靠前)
rank, err := this.GetInt("rank")
//處理錯誤
if err != nil {
//設定預設值
rank = 0
}
//建立友情連結結構體,並使用以上資訊對其初始化
var link = &models.Link{Sitename:sitename, Url:url, Rank:rank}
//插入友情連結
if err = link.Insert(); err != nil {
this.showmsg(err.Error())
}
//重定向,網址A隨時有可能改主意,重新顯示本身的內容或轉向其他的地方
this.Redirect("/admin/link/list", 302)
}
this.display()
}
##友情連結編輯
效果圖如下:
在該頁面主要實現了修改友情連結的相關資訊,使用者在點選儲存的時候,實際上會提交博文的id,該id在頁面上以隱藏域的形式在頁面上存在。在後臺獲取id,根據該id修改友情連結的相關資訊。
func (this *LinkController) Edit() {
//獲取友情連結id
id, _ := this.GetInt("id")
//建立友情連結結構體並初始化id
link := &models.Link{Id:id}
//通過id查詢友情連結
if err := link.Read(); err != nil {
this.showmsg("友鏈不存在!")
}
//判斷請求方式是不是post請求方式
if this.Ctx.Request.Method == "POST" {
//獲取網站名稱
sitename := strings.TrimSpace(this.GetString("sitename"))
//獲取網址
url := strings.TrimSpace(this.GetString("url"))
//獲取排序等級
rank, err := this.GetInt("rank")
//處理錯誤
if err != nil {
//設定預設等級為0
rank = 0
}
//設定網站名稱
link.Sitename = sitename
//設定網址
link.Url = url
//設定排序等級
link.Rank = rank
//跟新友情連結
link.Update()
//重定向,網址A隨時有可能改主意,重新顯示本身的內容或轉向其他的地方
this.Redirect("/admin/link/list", 302)
}
this.display()
this.Data["link"] = link
}
##友情連結刪除
效果圖如下:
使用者在點選刪除按鈕的時候會給與相應的刪除提示,該操作需要謹慎操作,因為資料一旦刪除無法恢復。在使用者確定刪除之後,將對應的id傳遞到後臺,然後在資料庫中根據該id將對應的記錄從資料庫中刪除,刪除成功重定向到友情連結列表頁面,否則給與對應的錯誤提示。
func (this *LinkController) Delete() {
//獲取友情連結id
id, err := this.GetInt("id")
//處理錯誤
if err != nil {
this.showmsg("刪除失敗!")
}
//建立友情連結結構體,並初始化id
link := &models.Link{Id:id}
//通過id查詢友情連結
if err = link.Read(); err == nil {
//刪除友情連結
link.Delete()
}
//重定向,網址A隨時有可能改主意,重新顯示本身的內容或轉向其他的地方
this.Redirect("/admin/link/list", 302)
}
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
清華團隊帶你實戰區塊鏈開發
掃碼獲取海量視訊及原始碼 QQ群:721929980