goweb 書城項目 項目地址在文末 設置處理靜態資源,如 css 和 js 文件 這裡統一處理了靜態資源,改變原前端頁面中相對路徑,變為以項目根目錄開始 view 開始,使客戶端可以訪問到服務端的資源 直接去 html 頁面 同上,處理了頁面的路徑跳轉 去首頁 主頁面的路由 userhander. ...
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)