天天看點

用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 架構。
Buffalo:使用 Go 語言快速建構 Web 應用。
Echo:簡約的高性能 Go 語言 Web 架構。
Gin:Go 語言編寫的 Web 架構,以更好的性能實作類似 Martini 架構的 API。
Iris:全宇宙最快的 Go 語言 Web 架構。完備 MVC 支援,未來盡在掌握。
Revel:Go 語言的高效、全棧 Web 架構。

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的架構結構很清晰也很簡單。

用golang實作一個小程式商城背景系統(moshopserver)用golang實作一個小程式商城背景系統(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/moshopserver

用戶端小程式界面截圖

最後附幾張截圖

用golang實作一個小程式商城背景系統(moshopserver)用golang實作一個小程式商城背景系統(moshopserver)
用golang實作一個小程式商城背景系統(moshopserver)用golang實作一個小程式商城背景系統(moshopserver)
用golang實作一個小程式商城背景系統(moshopserver)用golang實作一個小程式商城背景系統(moshopserver)
用golang實作一個小程式商城背景系統(moshopserver)用golang實作一個小程式商城背景系統(moshopserver)
用golang實作一個小程式商城背景系統(moshopserver)用golang實作一個小程式商城背景系統(moshopserver)
用golang實作一個小程式商城背景系統(moshopserver)用golang實作一個小程式商城背景系統(moshopserver)