goweb-書城專案
專案地址在文末
設定處理靜態資源,如 css 和 js 檔案
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("views/static"))))
這里統一處理了靜態資源,改變原前端頁面中相對路徑,變為以專案根目錄開始 view 開始,使客戶端可以訪問到服務端的資源
直接去 html 頁面
http.Handle("/pages/", http.StripPrefix("/pages/", http.FileServer(http.Dir("views/pages"))))
同上,處理了頁面的路徑跳轉
去首頁
http.HandleFunc("/main", controller.GetPageBooksByPrice)
主頁面的路由
userhander.go
去登錄
http.HandleFunc("/login", controller.Login)
實作了登錄功能,獲取前端頁面的輸入,對輸入的用戶名和密碼進行查詢,資料庫中是否存在,并是否正確,然后回傳結果,成功回傳登陸成功的界面,失敗提示用戶名或密碼錯誤,模板渲染用戶的名字,登錄成功后創建 session,并將資訊通過 cookie 存盤到 session,cookie 再發送給瀏覽器
去注銷
http.HandleFunc("/logout", controller.Logout)
獲取客戶端的 cookie,查詢 session 并從資料庫中洗掉 session,讓 cookie 失效,回傳給瀏覽器 cookie,并回到首頁
去注冊
http.HandleFunc("/regist", controller.Regist)
獲取用戶輸入,在資料庫中查詢用戶名是否存在,并給與提示,注冊成功的話回傳注冊成功的頁面,然后就可以進行登陸了
通過 Ajax 請求驗證用戶名是否可用
http.HandleFunc("/checkUserName", controller.CheckUserName)
這個函式實作 ajax 提示用戶名已存在,與上面的結合使用,前端請求該函式,這樣輸入了重復的用戶名,不會導致之前填寫的都消失,也就是頁面不會重繪,提高用戶體驗
bookhandler.go
獲取帶分頁的圖書資訊
http.HandleFunc("/getPageBooks", controller.GetPageBooks)
該處理器獲取頁碼,呼叫分頁的函式,用邏輯實作,上一頁和下一頁何時消失,決議到模板,到圖書館管理界面,分頁函式查詢資料庫獲取總頁數,并將所有圖書寫入結構體回傳,渲染的時候,書那一塊渲染書的結構體,頁數那一塊還要呼叫頁數的處理函式進行頁數的跳轉,在函式中渲染,這些函式(判斷是否有首頁,是否有尾頁,上一頁,下一頁)和定義頁數結構體處于同一個檔案,并且輸入頁數前端獲取指定的頁數值,還是呼叫了處理器,只不過,處理器會判斷有沒有頁數,有的話到指定頁數,沒有默認就是第一頁即首頁
渲染的頁面有洗掉功能和修改功能和增加功能,每個 herf 會回到處理器函式繼續處理,洗掉功能呼叫查詢資料庫并洗掉,然后執行獲取分頁圖書的處理器函式,增加功能和修改功能都會轉到同一個頁面,用動作來判斷渲染哪一部分,修改會通過書的 id(隱藏的 input 獲取 id)來連接前后端,轉到修改頁面,渲染適當的內容,修改過后提交,提交執行UpdateOrAddBook函式,獲取資料,向資料庫修改資料,實作對資料進行重繪,增加與修改類似,函式末尾跟洗掉一樣執行獲取頁碼的處理器函式,實作更新過的資料顯示
洗掉圖書
http.HandleFunc("/deleteBook", controller.DeleteBook)
在上面已經介紹過了
去更新圖書的頁面
http.HandleFunc("/toUpdateBookPage", controller.ToUpdateBookPage)
在上面已經介紹過了
更新或添加圖書
http.HandleFunc("/updateOraddBook", controller.UpdateOrAddBook)
在上面已經介紹過了
獲取帶分頁和價格范圍的圖書
http.HandleFunc("/getPageBooksByPrice", controller.GetPageBooksByPrice)
該處理器實作了在首頁根據輸入價格的最大和最小查詢符合條件的圖書,因為是給用戶看的,所以需要驗證是否處于登錄狀態,通過資料庫查詢 session 來驗證用戶是否登錄,查詢符合條件的圖書后,判斷 session,并更新渲染的資訊,是否渲染請登錄,資訊為怕個結構體,在此處復用一下上面寫的頁數代碼就 OK 了
carthandler.go
添加圖書到購物車中
http.HandleFunc("/addBook2Cart", controller.AddBook2Cart)
此處理器先判斷用戶是否登錄,沒登錄 ajax 提示登錄,沒登錄登錄的話,登錄的話,根據圖書獲取圖書資訊,通過 session 獲取用戶 id,判斷該用戶有沒有購物車,沒有購物車,創建購物車,并將選中的圖書加入新創建的購物項,購物項保存到切片中,完成這一步操作后,提示用戶將圖書加入了購物項,如果購物車已存在,去資料庫中先找到該用戶的購物車,添價商品先判斷購物車的購物項中是否有改購物項,沒有則創建購物項,加入到切片上,有則在原來的購物項的 count 上+1,并更新資料庫中購物項資料,購物車和購物項在資料庫中與用戶相關聯,購物車中有購物項的結構體,session 的 id 有用戶登錄時與用戶的 id 相關聯,這有一個容易犯的小錯誤,在獲取購物項時,一定要獲取圖書,不然會導致購物項中圖書加入到資料庫中看不到想要的結果,另外,購物車結構體所在的檔案有計算總數量和總價錢的方法,購物項結構體所在檔案有計算金額小計的方法
獲取購物車資訊
http.HandleFunc("/getCartInfo", controller.GetCartInfo)
這個處理器跳轉到購物車資訊頁面,首先根據 session 的 id 獲取對應的購物車,沒有則顯示購物車空空如也,有購物車則顯示有購物車,渲染到界面上,購物車存在 session 結構體上,所以可以直接傳 session,在其前端界面用 ajax 顯示了金額和數量,
清空購物車
http.HandleFunc("/deleteCart", controller.DeleteCart)
呼叫函式洗掉購物車,因為購物車與購物項關聯,所以洗掉購物車所有購物項后,才能洗掉購物該購物車,前端界面實作挽留:是否要洗掉
洗掉購物項
http.HandleFunc("/deleteCartItem", controller.DeleteCartItem)
獲取圖書資訊,在對應資料庫中洗掉購物項
更新購物項
http.HandleFunc("/updateCartItem", controller.UpdateCartItem)
該處理器實作更新更改購物項后的資料,在前端事件監聽那監聽到購物項發生變化就會呼叫該處理器,從而用 ajax 實作區域更新
去結賬
http.HandleFunc("/checkout", controller.Checkout)
該處理器在頁面實作跳轉,獲取購物車,生成訂單時間,并創建訂單,保存到資料庫,遍歷資料項,保存到訂單中,一氣合成,在首頁處更新書的數量:售出多少,還剩多少,清空該購物車,設定單號到 session,決議模板,頁面顯示單號,結賬完畢
orderhandler.go
獲取所有訂單
http.HandleFunc("/getOrders", controller.GetOrders)
獲取所有訂單,在頁面所有訂單資訊,會顯示發貨,識訓等,管理端和客戶端不一樣,為不同的單號設定不同的狀態,獲取狀態為訂單結構體的方法
獲取訂單詳情,即訂單所對應的所有的訂單項
http.HandleFunc("/getOrderInfo", controller.GetOrderInfo)
訂單頁面點擊訂單詳情,會跳轉到訂單詳情頁面,顯示該訂單中的所有圖書購買狀況,
獲取我的訂單
http.HandleFunc("/getMyOrder", controller.GetMyOrders)
針對客戶端,用戶登錄,根據 session 的 id 獲得對應的訂單并渲染模板
發貨
http.HandleFunc("/sendOrder", controller.SendOrder)
點擊呼叫函式改變訂單的狀態,管理端使用
確認識訓
http.HandleFunc("/takeOrder", controller.TakeOrder)
點擊呼叫函式改變訂單的狀態,客戶端使用
最后
前端的 herf 實作不同的處理器的功能的實作,很靈活,一個處理器可以多處去鏈接,多個鏈接可以使用一個處理器,入口處靜態資源處理一下,這就是入口函式要干的事,控制出全部寫處理器,處理器要用到的函式全寫到 dao 的檔案夾里去,資料的定義寫到 model 中區,utils 寫了資料庫連接和生成亂數值(訂單號,session 的 id),view 里面寫靜態頁面和靜態資源,其實標準的應該是 static 里寫靜態資源,view 寫頁面,這是一個純后端專案所以這每份這么細,
最后列一下處理器清單 從 main 入口可以知道所有的功能:
//設定處理靜態資源,如css和js檔案
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("views/static"))))
//直接去html頁面
http.Handle("/pages/", http.StripPrefix("/pages/", http.FileServer(http.Dir("views/pages"))))
//去首頁
http.HandleFunc("/main", controller.GetPageBooksByPrice)
//去登錄
http.HandleFunc("/login", controller.Login)
//去注銷
http.HandleFunc("/logout", controller.Logout)
//去注冊
http.HandleFunc("/regist", controller.Regist)
//通過Ajax請求驗證用戶名是否可用
http.HandleFunc("/checkUserName", controller.CheckUserName)
//獲取所有圖書
// http.HandleFunc("/getBooks", controller.GetBooks)
//獲取帶分頁的圖書資訊
http.HandleFunc("/getPageBooks", controller.GetPageBooks)
http.HandleFunc("/getPageBooksByPrice", controller.GetPageBooksByPrice)
//添加圖書
// http.HandleFunc("/addBook", controller.AddBook)
//洗掉圖書
http.HandleFunc("/deleteBook", controller.DeleteBook)
//去更新圖書的頁面
http.HandleFunc("/toUpdateBookPage", controller.ToUpdateBookPage)
//更新或添加圖書
http.HandleFunc("/updateOraddBook", controller.UpdateOrAddBook)
//添加圖書到購物車中
http.HandleFunc("/addBook2Cart", controller.AddBook2Cart)
//獲取購物車資訊
http.HandleFunc("/getCartInfo", controller.GetCartInfo)
//清空購物車
http.HandleFunc("/deleteCart", controller.DeleteCart)
//洗掉購物項
http.HandleFunc("/deleteCartItem", controller.DeleteCartItem)
//更新購物項
http.HandleFunc("/updateCartItem", controller.UpdateCartItem)
//去結賬
http.HandleFunc("/checkout", controller.Checkout)
//獲取所有訂單
http.HandleFunc("/getOrders", controller.GetOrders)
//獲取訂單詳情,即訂單所對應的所有的訂單項
http.HandleFunc("/getOrderInfo", controller.GetOrderInfo)
//獲取我的訂單
http.HandleFunc("/getMyOrder", controller.GetMyOrders)
//發貨
http.HandleFunc("/sendOrder", controller.SendOrder)
//確認識訓
http.HandleFunc("/takeOrder", controller.TakeOrder)
http.ListenAndServe(":8080", nil)
專案地址
專案地址
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/47179.html
標籤:Go
上一篇:goweb-擴展Web框架
