1. 程式人生 > >開源一個golang小程式商城後臺(moshopserver)

開源一個golang小程式商城後臺(moshopserver)

開源一個golang小程式商城後臺(moshopserver)

golang和c/c++比起來是一門新的語言,一直想學,網上搜集了一些資料,有些人說很容易上手,確實是這樣,和C/C++比起來,少了很多亂七八糟的語法。學一門新的語言,最好的方法就是動手寫一些東西,最近小程式也比較火,也想學一下,網路上搜索的一些開源專案,基本上沒有golang實現的,大部分都是nodejs和java寫的,那麼我就來實現一個golang版的吧,一石二鳥。

開發小程式前後端都需要開發,自己的前端經驗很少,搜尋了一些開原始碼,有一個小程式專案讓人眼前一亮,Nideshop,介面做的不錯,程式碼結構也清晰,而且前後端都實現了,自己的目標是學習golang和小程式,乾脆用golang重寫nideshop吧。

Web框架的選擇

nodejs和java已經一些很成熟的框架了,比如nodejs的thinkjs,java的spring框架。golang最近幾年才火起來,有一些web框架也比較新,有下面一些框架:

Beego:開源的高效能 Go 語言 Web 框架。
  • https://github.com/astaxie/beego
  • https://beego.me
Buffalo:使用 Go 語言快速構建 Web 應用。
  • https://github.com/gobuffalo/buffalo
  • https://gobuffalo.io
Echo:簡約的高效能 Go 語言 Web 框架。
  • https://github.com/labstack/echo
  • https://echo.labstack.com
Gin:Go 語言編寫的 Web 框架,以更好的效能實現類似 Martini 框架的 API。
  • https://github.com/gin-gonic/gin
  • https://gin-gonic.github.io/gin
Iris:全宇宙最快的 Go 語言 Web 框架。完備 MVC 支援,未來盡在掌握。
  • https://github.com/kataras/iris
  • https://iris-go.com
Revel:Go 語言的高效、全棧 Web 框架。
  • https://github.com/revel/revel
  • https://revel.github.io

Beego是國人寫的框架,文件很全,例子也不少,用的人也多,最後決定用這個框架。

使用xorm生成資料庫model

資料庫採用的是mysql,使用golang讀寫mysql beego已經實現了orm框架。但是資料庫表需要生成對應的struct,beego的orm貌似沒有自動生成的功能。採用了一個開源庫go-xorm/cmd,最後生成的資料庫表像下面這樣,奇怪的是沒有json標籤,而且這個xorm標籤,最後golang不認報了錯。還有一個問題是有些欄位型別xorm生成錯了。比如,資料庫中的DECIMAL欄位,xorm生成的結構體中的欄位型別為string,這個顯然是錯誤的。

type NideshopAd struct {
AdPositionId int    `xorm:"not null default 0 index SMALLINT(5)"`
Content      string `xorm:"not null default '' VARCHAR(255)"`
Enabled      int    `xorm:"not null default 1 index TINYINT(3)"`
EndTime      int    `xorm:"not null default 0 INT(11)"`
Id           int    `xorm:"not null pk autoincr SMALLINT(5)"`
ImageUrl     string `xorm:"not null TEXT"`
Link         string `xorm:"not null default '' VARCHAR(255)"`
MediaType    int    `xorm:"not null default 0 TINYINT(3)"`
Name         string `xorm:"not null default '' VARCHAR(60)"`
}

moshopserver框架結構

moshopserver的框架結構很清晰也很簡單。

前端小程式發起HTTP請求到Router(router轉發請求的各個階段能做一些過濾,這個後面要說一下),router識別出請求連結,將其轉發到相應的controller上面。還有三個底層的package:

  • models

    單純和資料庫打交道的介面都放在這個package下面。

  • services

    主要實現了三類功能,和微信互動的介面,快遞查詢介面和token生成,檢測介面。

  • Utils

一些基本的功能函式放在這個package下面。

Token驗證

token的生成驗證使用了jwt-go這個第三方庫,使用這個庫通過token來解析出userID,建立和驗證token是否過期,整個互動流程是下面這樣子:

  1. 小程式開啟的時候預設不登入,呼叫後臺介面,因為沒有token,解析不出來userid,返回小程式段提示使用者登入。
  2. 小程式呼叫微信後臺服務獲取userinfo,呼叫moshopserver後臺登入介面。
  3. 後臺介面呼叫微信後臺,解密userInfo中的相關欄位,生成一條使用者資訊插入moshopserver資料庫中。然後從資料庫中取出userid,生成帶過期時間的token。返回給小程式。
  4. 小程式呼叫微信後臺介面,將token儲存到微信服務端。接下來每次呼叫moshopserver後臺,都要從微信後臺取出token,然後傳遞到moshopsever後臺。
  5. 如果token過期或者無效,後端解析不出userid,返回給小程式,讓其再次登入。生成新的token。如此反覆。

Router過濾器

Nideshop中做了一些設計,有些介面即使token過期也能訪問,不需要提示使用者再次登入。moshopserver中也實現了這個功能。採用了beego中的過濾器:

    beego.InsertFilter("/api/*", beego.BeforeExec, services.FilterFunc, true, true)

使用的是BeforeExec引數,這個階段Router已經識別出了Controller和Action的具體型別,我們可以自己加判斷,到底哪些Controller和Action需要使用者登入許可權,這些Controller和action放在了配置檔案api.conf中:

[controller]
publicController= {'index','catalog','topic','auth','goods','brand','search','region'}
[action]
publicAction={'comment/list','comment/count','cart/index','cart/add','cart/checked','cart/update','cart/delete','cart/goodscount','pay/notify'}

如果HTTP請求連結的Controller和Action都不在配置檔案中,則跳過介面呼叫,直接返回小程式提示其進行重新登入。

問題

moshopserver還是有一些bug,因為測試不夠充分,應該也還存在一些未知的bug,以後慢慢修復。

已經問題:

  • 訂單列表中商品資訊不顯示。
  • 使用者登入後沒有顯示登入(頭像和使用者名稱不顯示)

歡迎Star,歡迎提問題。

https://github.com/harlanc/moshopser