<sup id="bovkp"><noscript id="bovkp"></noscript></sup><sup id="bovkp"></sup>
<dl id="bovkp"><ins id="bovkp"></ins></dl>
      <div id="bovkp"><span id="bovkp"></span></div>

          <samp id="bovkp"></samp>
          <dl id="bovkp"></dl><dl id="bovkp"></dl>

            <span id="bovkp"><form id="bovkp"><wbr id="bovkp"></wbr></form></span>

            首页> 小程序资讯 > 年会必备,5分钟学会制作年会抽奖小程序

            年会必备,5分钟学会制作年会抽奖小程序

            作者来源:微动天下

            创建日期: 2019-01-21 17:26:48

               浏览次数:14172

            免费生成微信小程序

            年会年年有,中奖次次无,不知道你们有没有中奖,反正我是终将绝缘体。好了,想必大家对年会抽奖小程序不了解吧,年会临近,制作一个年会抽奖小程序是非常必要的,下面我们要用Excel和golang制作一个抽奖小程序。

            用Excel制作年会抽奖小程序

            现在从A列成员中抽取3名中奖人员,效果如动图。


            下面我借用随机数:RANDRANDBETWEEN函数。

            获取0-1的随机数。

            =RAND()

            获取某个范围的随机数,例如1-12

            =RANDBETWEEN(1,12)


            Excel中更?#29575;?#25454;或按F9键,数据就会变动。

            Step 01 B2输入公式,并向下填充公式。

            =RAND()


            Step 02 D2输入公式,并下拉到D4,这样就刚好是三个名额。

            =LOOKUP(1,0/(LARGE($B$2:$B$13,ROW(A1))=$B$2:$B$13),$A$2:$A$13)


            LARGE函数语法说明:


            LARGE函数换成SMALL函数也可以。

            Step 03 一直按F9键,这样数据就有滚动的效果,停下来就是中奖名单。


            golang制作年会抽奖小程序

            之前在学区块链,然后看到很多区块链项目都是基于golang在开发,包括以太坊的官方go-ethereum。了解了下gogoogle出品,很多人说其有cc++的性能,然后却有脚本语?#32536;?#24320;发效率。我就被吸引到了,开始学一下。?#22870;?#21518;面搞后台遇到性能瓶颈的场景,以及区块链的开发。

            ?#30001;?#26368;近小程序大热,这块技术栈也要学习了解下。我就想着动手做个简单的抽奖小程序,后台可以用go来实现,又能学习小程序开发,一箭双雕,开搞。动手?#23548;?#27704;远是学习的最好方式。

            一、后台整体架构

            整体后台的结构设计就如上图:

            小程序和后台间使用https通信,保证安全性,这也是为了满足小程序官方的硬性规定。腾讯负载均衡作为后台入口有几个好处:帮助处理https的流量,然后解密后再将请求通过http转发给后端的服务器,简化了逻辑,减少了https对后台服务的性能影响,同?#34987;?#33021;配?#23186;?#34892;动态的伸缩。

            负载均衡将请求通过http转发给cvm进行处理。nginx做了个反向代理,go服务端跑在本地。

            使用腾?#23545;?#30340;redismysql数据库。redis用于频繁的?#27809;?#37492;权等,mysql保存常规数据。

            这样的设计在抽奖这种情境下,已经能保证足够的并发和流量了。如果想提高并发量,可以通过配置负载均衡来进行动态伸缩,然后增加云数据库的处理能力。有时间再写下怎么进行性能评测和相应的提高并发量的升级。

            二、抽奖流程设计

            因为每天工作挺忙的,没那么多时间。就准备先弄最简单的抽奖逻辑,有时间和精力再迭代。?#27809;?#21487;以进入小程序创建一个抽奖活动,设?#27809;?#21160;主题、开奖时间、奖品和数量。然后就能分享出去,其它?#27809;?#28857;击后参加抽奖。到达开奖时间后,则进行随机的开奖,每个参加抽奖的?#27809;?#26368;多只能中奖1次。开奖后,对所有抽奖?#27809;?#21457;送消息提醒。

            其实可以简单地利用开奖来进行大致划分:

            开奖前:?#27809;?#21019;建抽奖活动后,所有?#27809;?#37117;能参加抽奖、取消抽奖,创建者能?#22659;?#25277;奖活动。

            开奖中:到达开奖时间,锁定这个抽奖活动,不允许?#27809;?#25805;作了。然后内部进行抽奖,将奖品随机分给抽奖?#27809;А?/span>

            开奖后:奖品分配完毕,结果公布。向所有?#27809;?#23637;示开奖结果,需要通知到参加抽奖的?#27809;А?/span>

            三、api文档设计

            接口文档非常重要,?#26723;?#29992;心好好写,我觉得这是做后台开发的基本素养。不管项目小还是大,一份良好的文档是必需的。文档写好了,可以有很多好处。随着时间和迭代,我们依然能对每个接口有很好的了解。接口文档可以将后台开发同外部?#35272;?#33073;离开,使?#20204;?#31471;和后台能解耦。同?#20445;?#20889;接口文档的过程其实就是思考和梳理的过程,通过细致地讨论和思考,理清楚一些细节和避开一些坑。

            下面是我维护的文档,先是基本的描述,域名、基路径?#21462;?/span>


            然后就是每个接口的详细描述,要定义?#20204;?#27714;和返回的结构,以及每个参数的含义和格式。


            一个接口的信息

            我一般会在git上维护一份最新的md格式接口文档。如果有协作的话,其他人对接口有疑问,不用在沟通上每次扯皮,按照文档的说明来调用即可。

            四、实现

            4.1 web框架选择

            调研了下goweb框架,目前用?#23186;?#22810;的是beegoechogin,所?#36816;?#20415;选个就?#23567;?#25105;选了echo,感觉文档稍微全一些。但相对于其他语?#32536;?/span>web框架,echo的文档太少、不全,学习和使用成本高些。

            使用echo,我?#26085;?#20307;过了一遍官方文档,最好最全的资料还是官方文档介绍,所以英文要始终坚持学习。附上网址:https://echo.labstack.com/guide

            这里主要的流程基本差不多,注册url处理函数,然后就是crud操作,?#26696;?#31181;内部逻辑了。 每个请求附带了内部自定义的session_id,在echoMiddleware中进行验证。

            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:[email protected](127.0.0.1:3306)/lottery?charset=utf8')

            获取数据

            利用Query()绑定参数,进行查询。这里比?#19979;?#28902;的是获取db里的一行数据,需要用Scan()逐个赋值。当取出来数据很多的时候还是有点麻烦的,不过我还是蛮?#19981;?#33258;己操控sql语句的,一些orm框架用起来很简单,但对编程思维和写sql的训练不够。自?#30418;?/span>sql,就会考虑怎?#20174;?#21270;。我会经常多?#39318;?#24049;一些问题:能不能少进行一次sql查询?查询的sql语句能不能更高效?#21487;?#35745;的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)}

            更?#29575;?#25454;

            _, 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来执行更新、?#22659;?#31561;语句。

            事务

            事务的话,可?#36291;?#20307;?#27425;?#26723;:

            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,这里使用的是redisredis操作用的 github.com/garyburd/redigo/redis这个库。

            大家的流程都差不多:连接redis,然后进行putget操作。这里有个简单封装的例子,可以借鉴。https://github.com/aiscrm/redisgo/blob/master/redis.go

            4.3 微信登录流程

            这里可?#36816;?#19968;下微信?#27809;?#20351;用小程序,如何进行登录的流程。


            a.?#27809;?#36827;入小程序。小程序使用wx.login()去微信后台进行登录,登录成功会获得一个code。真实的返回是这样的:

            {errMsg: 'login:ok', code: '001nnSQv1QStGa0X1bSv13u7Rv1nnSQA}

            b.小程序将这个code发送我给我们自己的后台。

            c.后台收到这个code后,拼接一个url去微信后台获取该微信?#27809;?#30340;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:授权类?#20572;?#27492;处只需填写 authorization_code

            捞了条日志看下微信返回的数据。其中session_key,对应该?#27809;?#30340;会话密钥;expires_in,凭证有效时间,单位?#22909;耄?/span>openid,?#27809;?#21807;一标识。

            {'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:(隐私?#22659;?/span>]}

            d.自己后台定义登录态,返回给小程序自定义登录态。这个时候?#27809;?#30456;当于成功登录了,那?#27425;?#20204;给这个?#27809;?#19968;个我们自己定义的session_id,然后每个请求都需要携带此session_id,用于验证。

            4.4 抽奖活动状态机设计

            其实整个后台的业务逻辑重点是跟随抽奖活动的状态来变换的。所以每个发起的抽奖,我定义了几个状态,状态机如下:

            //数据库中抽奖活动的状态常量,const (

            DBEventStatusINIT     = 0 //抽奖中,活动创建后此状态,允许参加抽奖

            DBEventStatusOPENING  = 1 //开奖中,不允许抽奖了

            DBEventStatusOPEND    = 2 //已经开奖了,

            DBEventStatusCANCELED = 9 //活动取消 )


            抽奖活动的状态机

            活动创建成功?#27425;?#29366;态0,可以进行抽奖。

            创建者在开奖前可以取消,活动由0可转变为状态9,不可再抽奖,终态。

            状态0的活动开奖前1分钟,会进入开奖阶段,转换为状态1,这时候不可抽奖。

            抽奖完成后,状态为1的活动会转换为状态2,终态,进行通知结果?#21364;?#29702;。

            五、总结

            做完这个蛮?#37327;?#30340;,要学很多东西,看很多文档。比如小程序的官方文档需要看,不然登录等等后台没法配合。使用的语言是go,不是很熟悉,边学边干,echo框架的文档也要看。然后设计抽奖的整个流程,设计数据库,设?#24179;?#21475;请求和返回格式,编写接口文档。由于大块的时间不多,打断后再?#30001;?#25928;率很低。不过整个弄完,感觉对go和小程序有了一个比较全面的理解,接下?#27425;一?#20250;继续搞。

            然后如何用docker来快速部署?如何打造完整的自动化编译、部署、测?#32536;?#27969;程?这些后面有时间,我会后面继续总结发。

            -----------

            【微动天下】是新三板挂牌上市公司,专业做移动互联网小程序生态服务商。微动天下提供各行业微信小程序模板,可微信小程序在线制作,微信小程序定制开发。

            返回新闻列表

            相关文章推荐

            ?
            立刻免费定制

            输入您的电话号码,点击通话,?#38498;?#24744;将?#25317;?#25105;们的电话。

            手机请直接输入:如1380011xxxx

            座机前加区号:如010-5992xxxx

            该通话完全免费,请放心接听!

            仅需5秒,让微动更懂你
            • 餐饮
            • 美业
            • 教育
            • 汽车
            • 房产
            • 酒店
            • 电商
            • 游戏
            • 旅游
            • 其他
            立即咨询
            宁波总部 | ?#26412;?#20998;公司 | 广州分公司 |杭州分公司 | 天津分公司

            Copyright ? 2012-2019 www.rhsk.tw. All Rights Reserved 浙ICP备16000559号-3

            时时彩刷水稳赚的玩法
            <sup id="bovkp"><noscript id="bovkp"></noscript></sup><sup id="bovkp"></sup>
            <dl id="bovkp"><ins id="bovkp"></ins></dl>
                <div id="bovkp"><span id="bovkp"></span></div>

                    <samp id="bovkp"></samp>
                    <dl id="bovkp"></dl><dl id="bovkp"></dl>

                      <span id="bovkp"><form id="bovkp"><wbr id="bovkp"></wbr></form></span>
                      <sup id="bovkp"><noscript id="bovkp"></noscript></sup><sup id="bovkp"></sup>
                      <dl id="bovkp"><ins id="bovkp"></ins></dl>
                          <div id="bovkp"><span id="bovkp"></span></div>

                              <samp id="bovkp"></samp>
                              <dl id="bovkp"></dl><dl id="bovkp"></dl>

                                <span id="bovkp"><form id="bovkp"><wbr id="bovkp"></wbr></form></span>