

NEWS
將想法與焦點與您一起共享
年會必備,5分鐘學會制作年會抽獎小程序


免費生成微信小程序
年會年年有,中獎次次無,不知道你們有沒有中獎,反正我是終將絕緣體。好了,想必大家對年會抽獎小程序不了解吧,年會臨近,制作一個年會抽獎小程序是非常必要的,下面我們要用Excel和golang制作一個抽獎小程序。
用Excel制作年會抽獎小程序
現在從A列成員中抽取3名中獎人員,效果如動圖。
下面我借用隨機數:RAND和RANDBETWEEN函數。
獲取0-1的隨機數。
=RAND()
獲取某個范圍的隨機數,例如1-12。
=RANDBETWEEN(1,12)
在Excel中更新數據或按F9鍵,數據就會變動。
Step01在B2輸入公式,并向下填充公式。
=RAND()
Step02在D2輸入公式,并下拉到D4,這樣就剛好是三個名額。
=LOOKUP(1,0/(LARGE($B$2:$B$13,ROW(A1))=$B$2:$B$13),$A$2:$A$13)
LARGE函數語法說明:
LARGE函數換成SMALL函數也可以。
Step03一直按F9鍵,這樣數據就有滾動的效果,停下來就是中獎名單。
用golang制作年會抽獎小程序
之前在學區塊鏈,然后看到很多區塊鏈項目都是基于golang在開發,包括以太坊的官方go-ethereum。了解了下go是google出品,很多人說其有c/c++的性能,然后卻有腳本語言的開發效率。我就被吸引到了,開始學一下。方便后面搞后臺遇到性能瓶頸的場景,以及區塊鏈的開發。
加上最近小程序大熱,這塊技術棧也要學習了解下。我就想著動手做個簡單的抽獎小程序,后臺可以用go來實現,又能學習小程序開發,一箭雙雕,開搞。動手實踐永遠是學習的最好方式。
一、后臺整體架構
整體后臺的結構設計就如上圖:
小程序和后臺間使用https通信,保證安全性,這也是為了滿足小程序官方的硬性規定。騰訊負載均衡作為后臺入口有幾個好處:幫助處理https的流量,然后解密后再將請求通過http轉發給后端的服務器,簡化了邏輯,減少了https對后臺服務的性能影響,同時還能配置進行動態的伸縮。
負載均衡將請求通過http轉發給cvm進行處理。nginx做了個反向代理,go服務端跑在本地。
使用騰訊云的redis和mysql數據庫。redis用于頻繁的用戶鑒權等,mysql保存常規數據。
這樣的設計在抽獎這種情境下,已經能保證足夠的并發和流量了。如果想提高并發量,可以通過配置負載均衡來進行動態伸縮,然后增加云數據庫的處理能力。有時間再寫下怎么進行性能評測和相應的提高并發量的升級。
二、抽獎流程設計
因為每天工作挺忙的,沒那么多時間。就準備先弄最簡單的抽獎邏輯,有時間和精力再迭代。用戶可以進入小程序創建一個抽獎活動,設置活動主題、開獎時間、獎品和數量。然后就能分享出去,其它用戶點擊后參加抽獎。到達開獎時間后,則進行隨機的開獎,每個參加抽獎的用戶最多只能中獎1次。開獎后,對所有抽獎用戶發送消息提醒。
其實可以簡單地利用開獎來進行大致劃分:
開獎前:用戶創建抽獎活動后,所有用戶都能參加抽獎、取消抽獎,創建者能刪除抽獎活動。
開獎中:到達開獎時間,鎖定這個抽獎活動,不允許用戶操作了。然后內部進行抽獎,將獎品隨機分給抽獎用戶。
開獎后:獎品分配完畢,結果公布。向所有用戶展示開獎結果,需要通知到參加抽獎的用戶。
三、api文檔設計
接口文檔非常重要,值得用心好好寫,我覺得這是做后臺開發的基本素養。不管項目小還是大,一份良好的文檔是必需的。文檔寫好了,可以有很多好處。隨著時間和迭代,我們依然能對每個接口有很好的了解。接口文檔可以將后臺開發同外部依賴脫離開,使得前端和后臺能解耦。同時,寫接口文檔的過程其實就是思考和梳理的過程,通過細致地討論和思考,理清楚一些細節和避開一些坑。
下面是我維護的文檔,先是基本的描述,域名、基路徑等。
然后就是每個接口的詳細描述,要定義好請求和返回的結構,以及每個參數的含義和格式。
一個接口的信息
我一般會在git上維護一份最新的md格式接口文檔。如果有協作的話,其他人對接口有疑問,不用在溝通上每次扯皮,按照文檔的說明來調用即可。
四、實現
4.1web框架選擇
調研了下go的web框架,目前用得較多的是beego、echo、gin,所以隨便選個就行。我選了echo,感覺文檔稍微全一些。但相對于其他語言的web框架,echo的文檔太少、不全,學習和使用成本高些。
使用echo,我先整體過了一遍官方文檔,最好最全的資料還是官方文檔介紹,所以英文要始終堅持學習。附上網址:https://echo.labstack.com/guide
這里主要的流程基本差不多,注冊url處理函數,然后就是crud操作,及各種內部邏輯了。每個請求附帶了內部自定義的session_id,在echo的Middleware中進行驗證。
4.2數據庫操作
4.2.1mysql
我用到的是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(
idint
namestring
)rows,err:=db.Query('selectid,namefromuserswhereid=?',1)iferr!=nil{
log.Fatal(err)}deferrows.Close()forrows.Next(){
err:=rows.Scan(&id,&name)
iferr!=nil{
log.Fatal(err)
}
log.Println(id,name)}err=rows.Err()iferr!=nil{
log.Fatal(err)}
更新數據
_,err=db.Exec('updateeventssetstatus=?,cancel_time=?whereid=?andstatus=?',util.DBEventStatusCANCELED,time.Now().Unix(),queryEvent.ID,util.DBEventStatusINIT)
上面是我將抽獎活動從初始狀態,設置為取消狀態的sql語句,使用db.Exec來執行更新、刪除等語句。
事務
事務的話,可以具體看文檔:
tx,err:=db.Begin()iferr!=nil{
log.Fatal(err)}defertx.Rollback()stmt,err:=tx.Prepare('INSERTINTOfooVALUES(?)')iferr!=nil{
log.Fatal(err)}deferstmt.Close()fori:=0;i<10;i++{
_,err=stmt.Exec(i)
iferr!=nil{
log.Fatal(err)
}}err=tx.Commit()iferr!=nil{
log.Fatal(err)}
4.2.2redis
每個請求都需要進行鑒權session,這里使用的是redis。redis操作用的github.com/garyburd/redigo/redis這個庫。
大家的流程都差不多:連接redis,然后進行put、get操作。這里有個簡單封裝的例子,可以借鑒。https://github.com/aiscrm/redisgo/blob/master/redis.go
4.3微信登錄流程
這里可以說一下微信用戶使用小程序,如何進行登錄的流程。
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:7200openid:(隱私刪除)]”}
d.自己后臺定義登錄態,返回給小程序自定義登錄態。這個時候用戶相當于成功登錄了,那么我們給這個用戶一個我們自己定義的session_id,然后每個請求都需要攜帶此session_id,用于驗證。
4.4抽獎活動狀態機設計
其實整個后臺的業務邏輯重點是跟隨抽獎活動的狀態來變換的。所以每個發起的抽獎,我定義了幾個狀態,狀態機如下:
//數據庫中抽獎活動的狀態常量,const(
DBEventStatusINIT=0//抽獎中,活動創建后此狀態,允許參加抽獎
DBEventStatusOPENING=1//開獎中,不允許抽獎了
DBEventStatusOPEND=2//已經開獎了,
DBEventStatusCANCELED=9//活動取消)
抽獎活動的狀態機
活動創建成功即為狀態0,可以進行抽獎。
創建者在開獎前可以取消,活動由0可轉變為狀態9,不可再抽獎,終態。
狀態0的活動開獎前1分鐘,會進入開獎階段,轉換為狀態1,這時候不可抽獎。
抽獎完成后,狀態為1的活動會轉換為狀態2,終態,進行通知結果等處理。
五、總結
做完這個蠻辛苦的,要學很多東西,看很多文檔。比如小程序的官方文檔需要看,不然登錄等等后臺沒法配合。使用的語言是go,不是很熟悉,邊學邊干,echo框架的文檔也要看。然后設計抽獎的整個流程,設計數據庫,設計接口請求和返回格式,編寫接口文檔。由于大塊的時間不多,打斷后再接上效率很低。不過整個弄完,感覺對go和小程序有了一個比較全面的理解,接下來我還會繼續搞。
然后如何用docker來快速部署?如何打造完整的自動化編譯、部署、測試的流程?這些后面有時間,我會后面繼續總結發。
標簽:
- 微信小程序究竟依靠什么來搶占APP近80%的市場
2020-07-22 09:18
- 一款新的微信公眾號怎樣增加粉絲
2019-10-25 09:50
- 微信怎樣能快速加人:微信的加好友方法及好友基數分析
2019-11-12 09:24
- 微信小程序連接一切也必能鏈接市場紅利
2020-07-23 09:26
- 小程序時代到來,起個好名字多重要?
2020-04-26 14:05
- 微信小程序應該如何賦能電商行業?
2021-06-07 08:51
- 一文看懂小程序商城的邏輯、優勢、前景
2022-01-18 08:39
- 新微信公眾號怎樣增加粉絲
2019-11-06 18:27
- 一張圖看懂微信廣告推廣技巧
2019-11-05 09:28