<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • 微信抽獎小程序怎么弄(免費制作小程序抽獎活動的方法)


    之前在學區塊鏈,然后看到很多區塊鏈項目都是基于golang在開發,包括以太坊的官方go-ethereum。了解了下go是google出品,很多人說其有c/c++的性能,然后卻有腳本語言的開發效率。我就被吸引到了,開始學一下。方便后面搞后臺遇到性能瓶頸的場景,以及區塊鏈的開發。

    加上最近小程序大熱,這塊技術棧也要學習了解下。我就想著動手做個簡單的抽獎小程序,后臺可以用go來實現,又能學習小程序開發,一箭雙雕,開搞。動手實踐永遠是學習的最好方式。

    p.s. 如果你是golang初學者,下圖的資料可以下載看看。點擊小編頭像,關注之后私信回復“資料”即可獲取。

    超詳細教程!Golang實現一個微信抽獎小程序后臺

    一、后臺整體架構

    超詳細教程!Golang實現一個微信抽獎小程序后臺

    后臺架構

    整體后臺的結構設計就如上圖:

    • 小程序和后臺間使用https通信,保證安全性,這也是為了滿足小程序官方的硬性規定。騰訊負載均衡作為后臺入口有幾個好處:幫助處理https的流量,然后解密后再將請求通過http轉發給后端的服務器,簡化了邏輯,減少了https對后臺服務的性能影響,同時還能配置進行動態的伸縮。
    • 負載均衡將請求通過http轉發給cvm進行處理。nginx做了個反向代理,go服務端跑在本地。
    • 使用騰訊云的redis和mysql數據庫。redis用于頻繁的用戶鑒權等,mysql保存常規數據。

    這樣的設計在抽獎這種情境下,已經能保證足夠的并發和流量了。如果想提高并發量,可以通過配置負載均衡來進行動態伸縮,然后增加云數據庫的處理能力。有時間再寫下怎么進行性能評測和相應的提高并發量的升級。

    二、抽獎流程設計

    因為每天工作挺忙的,沒那么多時間。就準備先弄最簡單的抽獎邏輯,有時間和精力再迭代。用戶可以進入小程序創建一個抽獎活動,設置活動主題、開獎時間、獎品和數量。然后就能分享出去,其它用戶點擊后參加抽獎。到達開獎時間后,則進行隨機的開獎,每個參加抽獎的用戶最多只能中獎1次。開獎后,對所有抽獎用戶發送消息提醒。

    其實可以簡單地利用開獎來進行大致劃分:

    • 開獎前:用戶創建抽獎活動后,所有用戶都能參加抽獎、取消抽獎,創建者能刪除抽獎活動。
    • 開獎中:到達開獎時間,鎖定這個抽獎活動,不允許用戶操作了。然后內部進行抽獎,將獎品隨機分給抽獎用戶。
    • 開獎后:獎品分配完畢,結果公布。向所有用戶展示開獎結果,需要通知到參加抽獎的用戶。
    超詳細教程!Golang實現一個微信抽獎小程序后臺

    一些重要的接口

    三、api文檔設計

    接口文檔非常重要,值得用心好好寫,我覺得這是做后臺開發的基本素養。不管項目小還是大,一份良好的文檔是必需的。文檔寫好了,可以有很多好處。隨著時間和迭代,我們依然能對每個接口有很好的了解。接口文檔可以將后臺開發同外部依賴脫離開,使得前端和后臺能解耦。同時,寫接口文檔的過程其實就是思考和梳理的過程,通過細致地討論和思考,理清楚一些細節和避開一些坑。

    下面是我維護的文檔,先是基本的描述,域名、基路徑等。

    超詳細教程!Golang實現一個微信抽獎小程序后臺

    然后就是每個接口的詳細描述,要定義好請求和返回的結構,以及每個參數的含義和格式。

    超詳細教程!Golang實現一個微信抽獎小程序后臺

    一個接口的信息

    我一般會在git上維護一份最新的md格式接口文檔。如果有協作的話,其他人對接口有疑問,不用在溝通上每次扯皮,按照文檔的說明來調用即可。

    四、實現

    4.1 web框架選擇

    調研了下go的web框架,目前用得較多的是beego、echo、gin,所以隨便選個就行。我選了echo,感覺文檔稍微全一些。但相對于其他語言的web框架,echo的文檔太少、不全,學習和使用成本高些。

    使用echo,我先整體過了一遍官方文檔,最好最全的資料還是官方文檔介紹,所以英文要始終堅持學習。附上網址:https://echo.labstack.com/guide

    這里主要的流程基本差不多,注冊url處理函數,然后就是crud操作,及各種內部邏輯了。 每個請求附帶了內部自定義的session_id,在echo的Middleware中進行驗證。

    4.2 數據庫操作

    4.2.1 mysql

    我用到的是Go-MySQL-Driver這個包,github地址:https://github.com/go-sql-driver/mysql

    如何crud的話,我看了遍使用文檔,地址:http://go-database-sql.org/

    • 連接db
    import "database/sql" import _ "github.com/go-sql-driver/mysql" db, err = sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/lottery?charset=utf8")
    • 獲取數據

    利用Query()綁定參數,進行查詢。這里比較麻煩的是獲取db里的一行數據,需要用Scan()逐個賦值。當取出來數據很多的時候還是有點麻煩的,不過我還是蠻喜歡自己操控sql語句的,一些orm框架用起來很簡單,但對編程思維和寫sql的訓練不夠。自己寫sql,就會考慮怎么優化。我會經常多問自己一些問題:能不能少進行一次sql查詢?查詢的sql語句能不能更高效?設計的sql表能不能更優?

    var ( 
    id int
    name string
    )rows, err := db.Query("select id, name from users where id = ?", 1) if err != nil {
    log.Fatal(err)}defer rows.Close() for rows.Next() {
    err := rows.Scan(&id, &name)
    if err != nil {
    log.Fatal(err)
    }
    log.Println(id, name) }err = rows.Err() if err != nil {
    log.Fatal(err)}
    • 更新數據
    _, err = db.Exec("update events set status = ?,cancel_time=? where id = ? and status=?", util.DBEventStatusCANCELED, time.Now().Unix(), queryEvent.ID, util.DBEventStatusINIT)

    上面是我將抽獎活動從初始狀態,設置為取消狀態的sql語句, 使用db.Exec來執行更新、刪除等語句。

    • 事務

    事務的話,可以具體看文檔:

    tx, err := db.Begin() if err != nil { 
    log.Fatal(err)}defer tx.Rollback() stmt, err := tx.Prepare("INSERT INTO foo VALUES (?)") if err != nil {
    log.Fatal(err)}defer stmt.Close() for i := 0; i < 10; i++ {
    _, err = stmt.Exec(i)
    if err != nil {
    log.Fatal(err)
    } }err = tx.Commit() if err != nil {
    log.Fatal(err)}

    4.2.2 redis

    每個請求都需要進行鑒權session,這里使用的是redis。redis操作用的 github.com/garyburd/redigo/redis這個庫。

    大家的流程都差不多:連接redis,然后進行put、get操作。這里有個簡單封裝的例子,可以借鑒。https://github.com/aiscrm/redisgo/blob/master/redis.go

    4.3 微信登錄流程

    這里可以說一下微信用戶使用小程序,如何進行登錄的流程。

    超詳細教程!Golang實現一個微信抽獎小程序后臺

    a.用戶進入小程序。小程序使用wx.login()去微信后臺進行登錄,登錄成功會獲得一個code。真實的返回是這樣的:

    {errMsg: "login:ok", code: "001nnSQv1QStGa0X1bSv13u7Rv1nnSQA”}

    b.小程序將這個code發送我給我們自己的后臺。

    c.后臺收到這個code后,拼接一個url去微信后臺獲取該微信用戶的session_key。

    https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    各字段的含義:

    appid:這里填小程序 appId

    secret:小程序 appSecret

    js_code:小程序發來的 code

    grant_type:授權類型,此處只需填寫 authorization_code

    撈了條日志看下微信返回的數據。其中session_key,對應該用戶的會話密鑰;expires_in,憑證有效時間,單位:秒;openid,用戶唯一標識。

    {"time":"2018-10-13T18:19:41.472758451+08:00","level":"DEBUG","prefix":"echo","file":"auth.go","line":"52","message":"result:map[session_key:ig6tsRoILO2cpxCnk0TXVg== expires_in:7200 openid:(隱私刪除)]”}

    d.自己后臺定義登錄態,返回給小程序自定義登錄態。這個時候用戶相當于成功登錄了,那么我們給這個用戶一個我們自己定義的session_id,然后每個請求都需要攜帶此session_id,用于驗證。

    4.4 抽獎活動狀態機設計

    其實整個后臺的業務邏輯重點是跟隨抽獎活動的狀態來變換的。所以每個發起的抽獎,我定義了幾個狀態,狀態機如下:

    //數據庫中抽獎活動的狀態常量,const ( 
    DBEventStatusINIT = 0 //抽獎中,活動創建后此狀態,允許參加抽獎
    DBEventStatusOPENING = 1 //開獎中,不允許抽獎了
    DBEventStatusOPEND = 2 //已經開獎了,
    DBEventStatusCANCELED = 9 //活動取消 )
    超詳細教程!Golang實現一個微信抽獎小程序后臺

    抽獎活動的狀態機

    • 活動創建成功即為狀態0,可以進行抽獎。
    • 創建者在開獎前可以取消,活動由0可轉變為狀態9,不可再抽獎,終態。
    • 狀態0的活動開獎前1分鐘,會進入開獎階段,轉換為狀態1,這時候不可抽獎。
    • 抽獎完成后,狀態為1的活動會轉換為狀態2,終態,進行通知結果等處理。

    五、總結

    使用的語言是go,不是很熟悉,邊學邊干,echo框架的文檔也要看。然后設計抽獎的整個流程,設計數據庫,設計接口請求和返回格式,編寫接口文檔。由于大塊的時間不多,打斷后再接上效率很低。不過整個弄完,感覺對go和小程序有了一個比較全面的理解,接下來我還會繼續搞。

    然后如何用docker來快速部署?如何打造完整的自動化編譯、部署、測試的流程?這些后面有時間,我會后面繼續總結發。

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费