goweb-bookstore

goweb-書城項目

項目地址在文末css

設置處理靜態資源,如 css 和 js 文件

http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("views/static"))))html

這裏統一處理了靜態資源,改變原前端頁面中相對路徑,變爲以項目根目錄開始 view 開始,使客戶端能夠訪問到服務端的資源前端

直接去 html 頁面git

http.Handle("/pages/", http.StripPrefix("/pages/", http.FileServer(http.Dir("views/pages"))))github

同上,處理了頁面的路徑跳轉web

去首頁ajax

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)

項目地址

項目地址

本站公眾號
   歡迎關注本站公眾號,獲取更多信息