部落格後臺登入,使用者,說說等功能實現

尹成發表於2018-11-14

#後臺登入
後臺登入頁面效果圖如下:
這裡寫圖片描述
該頁面主要實現登入功能,在使用者輸入對應的資料並點選登入按鈕的時候,在後臺獲取對應的資訊,根據賬號在資料庫中查詢資料,如果沒有該使用者或出現其他錯誤會在前臺給與對應的提示。如果使用者勾選了記住一週需要將使用者登入的資訊儲存到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
在這裡插入圖片描述

相關文章