部落格後臺登入,使用者,說說等功能實現
#後臺登入
後臺登入頁面效果圖如下:
該頁面主要實現登入功能,在使用者輸入對應的資料並點選登入按鈕的時候,在後臺獲取對應的資訊,根據賬號在資料庫中查詢資料,如果沒有該使用者或出現其他錯誤會在前臺給與對應的提示。如果使用者勾選了記住一週需要將使用者登入的資訊儲存到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
相關文章
- 說說如何在登入頁實現生成驗證碼功能
- 面試官:來說說單點登入的三種實現方式面試
- Laravel5.6 實現後臺管理登入(自定義使用者表登入)Laravel
- Emlog漏洞————Emlog部落格系統後臺無視驗證碼暴力破解實現登入
- 後臺實戰——使用者登入之JWTJWT
- 實戰react技術棧+express前後端部落格專案(5)-- 前後端實現登入功能ReactExpress後端
- 部落格專案前臺實現
- Go 部落格平臺 Pipe 1.8.2 釋出,支援 GitHub 登入GoGithub
- Django搭建個人部落格--使用者的登入和登出Django
- 部落格園登入請求分析
- 02-個人部落格筆記-登入註冊介面的實現筆記
- Oracle 後臺程式 說明Oracle
- 啊哈:HTML5自由者部落格搬家說明HTML
- 如何理解CDN?說說實現原理?
- 實戰react技術棧+express前後端部落格專案(6)-- 使用session實現免登陸+管理後臺許可權驗證ReactExpress後端Session
- 使用 Filamentphp 重構部落格管理後臺PHP
- 細說TF服務鏈丨服務鏈後臺的路由實現路由
- 黑馬部落格——詳細步驟(二)專案功能的實現之登入功能
- 微博爬蟲“免登入”技巧詳解及 Java 實現(業餘草的部落格)爬蟲Java
- 說說如何實現一個模板引擎
- [python][flask] Flask 入門(以一個部落格後臺為例)PythonFlask
- QQ模擬登入實現後篇
- 說說VNode節點(Vue.js實現)Vue.js
- Java Web實現使用者登入功能JavaWeb
- QQ登陸功能的實現2 - rolends1986 - 部落格園
- 都說搭部落格簡單,鬼知道後端程式設計師要經歷什麼!後端程式設計師
- 蘋果官方部落格:從SDK詳說Swift程式碼的改變蘋果Swift
- ThinkPHP5.0 部落格後臺管理(最新版)PHP
- 使用React + Antd 搭建部落格後臺系統React
- Laravel 融合 Markdown 做部落格書寫後臺案例Laravel
- node+koa2+mysql搭建部落格後臺MySql
- 說說如何用 JavaScript 實現一個模板引擎JavaScript
- 面試官:說說反射的底層實現原理?面試反射
- 部落格入門
- Laravel 實現 passport 使用者註冊登入LaravelPassport
- laravel 實現多使用者體系登入Laravel
- Rest 風格說明REST
- java JDBC練手過程:使用者登入功能的實現—從前端到後臺(包括資料庫)JavaJDBC前端資料庫