開源一個golang小程序商城後臺系統(moshopserver)

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

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

開發小程序先後端都須要開發,本身的前端經驗不多,搜索了一些開源代碼,有一個小程序項目讓人眼前一亮,Nideshop,界面作的不錯,代碼結構也清晰,並且先後端都實現了,本身的目標是學習golang和小程序,乾脆用golang重寫nideshop吧。java

Web框架的選擇

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

Beego:開源的高性能 Go 語言 Web 框架。
Buffalo:使用 Go 語言快速構建 Web 應用。
Echo:簡約的高性能 Go 語言 Web 框架。
Gin:Go 語言編寫的 Web 框架,以更好的性能實現相似 Martini 框架的 API。
Iris:全宇宙最快的 Go 語言 Web 框架。完備 MVC 支持,將來盡在掌握。
Revel:Go 語言的高效、全棧 Web 框架。

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

使用xorm生成數據庫model

數據庫採用的是mysql,使用golang讀寫mysql beego已經實現了orm框架。可是數據庫表須要生成對應的struct,beego的orm貌似沒有自動生成的功能。採用了一個開源庫go-xorm/cmd,最後生成的數據庫表像下面這樣,奇怪的是沒有json標籤,並且這個xorm標籤,最後golang不認報了錯。還有一個問題是有些字段類型xorm生成錯了。好比,數據庫中的DECIMAL字段,xorm生成的結構體中的字段類型爲string,這個顯然是錯誤的。c++

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

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

  • modelsgolang

    單純和數據庫打交道的接口都放在這個package下面。web

  • servicesspring

    主要實現了三類功能,和微信交互的接口,快遞查詢接口和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

客戶端小程序界面截圖

最後附幾張截圖

首頁

專題

分類

商品列表

商品詳情

購物車

相關文章
相關標籤/搜索