年会必备,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来快速部署?如何打造完整的自动化编译、部署、测试的流程?这些后面有时间,我会后面继续总结发。
标签:
- 微信电商小程序为中小企业助威获取更多红利
2021-05-26 14:12
- 利用小程序创业这些商业秘密你应该知道
2019-12-20 09:04
- 小型商家能够利用小程序打造O2O服务呢?
2021-06-07 08:51
- 微信小程序如何帮助实体行业转型?
2019-11-26 08:59
- 微信推广消息推送时间在什么时候
2019-11-04 09:01
- 微信小程序为啥子这么火
2020-01-09 09:07
- 小程序定制对行业有什么要求,最适合什么行业?
2020-07-22 16:47
- 如何做好营销活动小程序?
2021-11-24 08:40
- 微信公众号图文怎样吸引大众粉丝?
2019-12-09 17:50