超详细教程!Golang实现一个微信抽奖小程序后台
以前在学区块链技术,随后看见许多区块链项目全是根据golang在开发设计,包含以太币的官方网go-ethereum。了解了下go是google荣誉出品,很多人说其有c/c 的性能,随后却有开发语言的研发高效率。我便被吸引住到了,逐渐学一下。便捷后边搞后台碰到性能短板的情景,及其区块链技术的开发设计。
再加上近期微信小程序热门,这方面技术栈也需要了解学习下。我便想亲手做个简便的抽奖微信小程序,后台可以用go来完成,又能学习培训小程序定制开发,一箭双雕,开搞。动手能力实践活动始终是了解的较好方法。
p.s. 如果你是golang新手,下面的图的材料可以下载看一下。点一下我头像图片,一、后台总体构架总体后台的总体设计就如上图所述:微信小程序和后台间应用https通讯,确保安全系数,这也是因为达到微信小程序官方网的明确规定。腾讯官方web服务做为后台通道有几个益处:协助解决https的总流量,随后破译后再将要求根据http发送给后端网络服务器,简单化了逻辑性,降低了https对后台服务项目的性能危害,与此同时还能配备开展信息的伸缩式。web服务将要求根据http发送给cvm开展解决。nginx进行了个端口转发,go服务器端跑在当地。应用腾讯云服务的redis和mysql数据库。redis用以反复的用户身份验证等,mysql储存基本数据信息。那样的设计在抽奖这类情景下,已经能确保充分的高并发和总流量了。假如想提升并发量,可以根据配备web服务来开展动态性伸缩式,随后提升数据库服务器的解决工作能力。有时间再记录如何开展性能测评和相对的提升并发量的更新。
二、抽奖步骤设计方案由于每日工作挺忙的,没那么多时长。就提前准备先弄非常简单的抽奖逻辑性,有时间和时间再优化。用户可以进到微信小程序建立一个抽奖主题活动,设定活动标题、开奖日期、礼品和总数。随后就能共享出来,其他用户点一下后参与抽奖。抵达开奖日期后,则开展任意的出奖,每一个参与抽奖的用户较多只有得奖1次。出奖后,对全部抽奖用户推送消息提示。
实际上可以简便地运用出奖来开展大概区划:
出奖前:用户建立抽奖主题活动后,全部用户都能参与抽奖、撤销抽奖,创始人能删掉抽奖主题活动。出奖中:抵达开奖日期,锁住这一抽奖主题活动,不允许用户实际操作了。随后内部结构开展抽奖,将奖励任意分到抽奖用户。出奖后:礼品分派结束,结论发布。向全部用户展现开奖号码,必须通告到参与抽奖的用户。插口文档十分关键,非常值得认真好好地写,我认为这也是做后台开发设计的主要素质。无论新项目小或是大,一份较好的文档是需要的。文档写好啦,可以有很多益处。伴随着时间段和优化,大家仍然能对每一个端口有不错的掌握。插口文档可以将后台开发设计同外界依靠摆脱开,促使前面和后台能解耦。与此同时,写插口文档的全过程实际上便是考虑和归纳的全过程,根据仔细地探讨和思索,理清晰一些关键点和避免一些坑。下边就是我维护保养的文档,起先基本上的叙述,网站域名、基途径等。
随后便是每一个插口的详细说明,要定位好要求和返还的构造,及其每一个主要参数的意义和文件格式。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/
联接dbimport "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
这儿可以说一下a.用户进到微信小程序。小程序应用
c.后台接到这一code后,拼凑一个url去
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
捞了条日志看看
{"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 //活动取消 )应用的语种是go,并不是很了解,边学边干,echo架构的文档也需看。随后设计方案抽奖的整体步骤,设计方案数据库查询,设计方案插口申请和回到文件格式,撰写插口文档。因为块状的時间很少,切断后再接好效果很低。但是全部做完,觉得对go和微信小程序拥有一个非常全方位的了解,下面我还会搞。
随后怎样用docker来迅速布署?怎样打造出详细的自动化技术编译程序、布署、检测的步骤?这种后边有时间,我能后边再次汇总发。
- 免责声明
- 世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
- 风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
- 世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。