国产精品一区二区不卡-国产精品一区二区不卡的视频-国产精品一区二区国产-国产精品一区二区久久不卡-国产精品一区二区久久精品

石家莊網絡公司電話

年會必備,5分鐘學會制作年會抽獎小程序

2019-11-22 10:15實搜網絡

免費生成微信小程序

年會年年有,中獎次次無,不知道你們有沒有中獎,反正我是終將絕緣體。好了,想必大家對年會抽獎小程序不了解吧,年會臨近,制作一個年會抽獎小程序是非常必要的,下面我們要用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來快速部署?如何打造完整的自動化編譯、部署、測試的流程?這些后面有時間,我會后面繼續總結發。

標簽:


34
分享到:
主站蜘蛛池模板: 看欧美黄色大片 | 欧美一级aa免费毛片 | 久久er这里只有精品 | 欧美区一区二区三 | 久久亚洲国产欧洲精品一 | 免费看大片的 | japanhd成人快色 | 免费一级大片儿 | 亚洲精品一区二区三区www | 人成免费 | 国产乱码精品一区二区三上 | 成熟女人免费一级毛片 | 毛片三级在线观看 | 香蕉亚洲 | 一级毛片在线完整观看 | 在线看免费观看韩国特黄一级 | 亚洲欧美日韩中文字幕在线不卡 | 国产视频 每日更新 | 看草逼| 欧美亚洲视频在线观看 | 色婷婷激婷婷深爱五月老司机 | 有一婷婷色 | 中国一级全黄的免费观看 | 亚洲激情视频图片 | 日韩操片 | 99久热在线精品视频观看 | 人人九九精 | 久久精品亚洲精品国产色婷 | 欧美日韩在线成人看片a | 成人在线免费视频观看 | 国内精品久久久久久西瓜色吧 | 毛片一级做a爰片性色 | 女人被男人狂躁视频免费 | 国产精品亚洲精品日韩动图 | 免费鲁丝片一级观看 | 片免费观看网站视频 | 国产大片免费观看资源 | 一级特一级特色生活片 | 三级毛片在线免费观看 | 色综合久久亚洲国产日韩 | 欧美一级黄色带 |