首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang实现一个微信抽奖小程序后台

Golang实现一个微信抽奖小程序后台

原创
作者头像
J_J
发布于 2018-10-13 15:46:25
发布于 2018-10-13 15:46:25
8.9K10
代码可运行
举报
文章被收录于专栏:每周一脱topic每周一脱topic
运行总次数:0
代码可运行

​之前在学区块链,然后看到很多区块链项目都是基于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.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/

  • 连接db
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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表能不能更优?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
}
  • 更新数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_, 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来执行更新、删除等语句。

  • 事务

事务的话,可以具体看文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.用户进入小程序。小程序使用wx.login()去微信后台进行登录,登录成功会获得一个code。真实的返回是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{errMsg: "login:ok", code: "001nnSQv1QStGa0X1bSv13u7Rv1nnSQA”}

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

c.后台收到这个code后,拼接一个url去微信后台获取该微信用户的session_key。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,用户唯一标识。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"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 抽奖活动状态机设计

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//数据库中抽奖活动的状态常量,
const ( 
  DBEventStatusINIT     = 0 //抽奖中,活动创建后此状态,允许参加抽奖 
  DBEventStatusOPENING  = 1 //开奖中,不允许抽奖了 
  DBEventStatusOPEND    = 2 //已经开奖了, 
  DBEventStatusCANCELED = 9 //活动取消 
)
抽奖活动的状态机
抽奖活动的状态机
  • 活动创建成功即为状态0,可以进行抽奖。
  • 创建者在开奖前可以取消,活动由0可转变为状态9,不可再抽奖,终态。
  • 状态0的活动开奖前1分钟,会进入开奖阶段,转换为状态1,这时候不可抽奖。
  • 抽奖完成后,状态为1的活动会转换为状态2,终态,进行通知结果等处理。

五、总结

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
版主,能不能放出源码向你学习一下啊。最近也在学习golang
版主,能不能放出源码向你学习一下啊。最近也在学习golang
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
微信小程序中用户登录和登录态维护
提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情。像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件。
一斤代码
2018/08/21
5.9K0
微信小程序中用户登录和登录态维护
【Uniapp】小程序携带Token请求接口+无感知登录方案2.0
本次改进原文《【Uniapp】小程序携带Token请求接口+无感知登录方案》,在实际使用过程中我发现以下bug
德宏大魔王
2023/08/08
1.3K0
【Uniapp】小程序携带Token请求接口+无感知登录方案2.0
微信小程序登录那些事
最近团队在开发一款小程序,都是新手,一边看文档,一边开发。在开发中会遇到各种问题,今天把小程序登录这块的流程整理下,做个记录。
猿天地
2019/03/07
2.1K0
【Uniapp】小程序携带Token请求接口+无感知登录方案
所以说,access_token 只是用来调用一些微信提供的api服务的,并且access_token 只有两个小时,你把access_token当作小程序的token?不仅不满足暴露这个问题,时间上也有限制
德宏大魔王
2023/08/08
1.7K0
【Uniapp】小程序携带Token请求接口+无感知登录方案
微信小程序 接口调用讲解 (AccessToken、小程序码登录)
♘ 通过微信小程序实现扫码登录 ♘【网页版】使用小程序码登录 ♘ 通过扫小程序码实现网站登录功能
泥豆芽儿 MT
2022/05/10
20.2K0
微信小程序 接口调用讲解 (AccessToken、小程序码登录)
【愚公系列】2022年09月 微信小程序-微信小程序实现网页一键登录功能
如果微信小程序要获取微信登录的用户信息,需要拿到code去后台换取用户信息,具体步骤又如下:
愚公搬代码
2022/10/05
1.7K0
小程序开发知识点总结
我承认,最近比较懒了,博客也很久没更新了,太对不住自己了,做了一段时间小程序开发,总结了一些知识点,直接上菜。
用户1141560
2018/08/20
1.3K0
小程序开发知识点总结
Redis优化高并发下的秒杀性能
乐观锁实际上并不存在真正的锁,乐观锁是利用数据的某个字段来做的,比如本文的例子就是以UserId来实现的。
Lemon黄
2019/11/01
1.8K0
Redis优化高并发下的秒杀性能
微信小程序高级基础
微信小程序高级基础 微信小程序的注册和服务器配置: 小程序是什么呢?小程序是一种不需要下载安装就可以使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下就可以打开应用,也体现了龙哥"用
达达前端
2019/07/04
1.4K0
11-微信小程序授权登录
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。 登录流程:
度假的小鱼
2024/12/26
7970
11-微信小程序授权登录
微信小程序获取用户信息
在微信小程序中,如果想获取用户的昵称等信息可以不用另外写后台,如果需要获取用户的unionId,则需要后台来提供获取sessionKey和解码encryptedData。
OECOM
2020/07/01
3.5K0
微信小程序与php后端交互_微信小程序数据库放哪
var userNick = res.userInfo.nickName;//用户昵称
全栈程序员站长
2022/09/30
4.3K0
微信小程序与php后端交互_微信小程序数据库放哪
详解微信小程序登录wx.login(Object object)
小程序开发涉及用户登录流程,但是,微信的登录这一套登录体系是真有点搞不懂,下面是官方的流程图
青年码农
2020/11/19
10.8K0
详解微信小程序登录wx.login(Object object)
小程序同步微信步数
小程序获取微信运动步数,咱们看文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html
php007
2019/08/08
3.7K0
小程序同步微信步数
微信小程序开发(一) 微信登录流程
做过微信登录的都知道,我们需要一个标识来记录用户的身份的唯一性,在微信中unionId就是我们所需要的记录唯一ID,那么如何拿到unionId就成了关键,我将项目分为小程序和 后台PHP代码两部分来讲。
开发者技术前线
2020/11/23
4.2K0
微信小程序开发(一)  微信登录流程
微信小程序开发用户授权登录
第三方服务器和微信服务器: 注意:session_key是微信服务器生成的针对用户数据进行加密签名的密钥,不应该进行传输到客户端.
达达前端
2022/04/29
2.7K0
微信小程序开发用户授权登录
微信小程序登录学习
页面加载时检测session,若失效则重新登录,并将获取的skey存入localStorage
治电小白菜
2020/08/25
3.8K0
微信小程序登录学习
如何实现小程序登录鉴权
为了方便用户使用小程序时,使用微信账号授权快速登录软件,微信小程序提供了相关的授权接口。小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。以便但是对于新手来说,配置起来还是有些难度。
chen313
2018/11/02
8.3K0
如何实现小程序登录鉴权
Spring Boot+微信小程序_保存微信登录者的个人信息
微信小程序开发平台,提供有一类 API,可以让开发者获取到微信登录用户的个人数据。这类 API 统称为开放接口。
一枚大果壳
2022/08/23
1.7K0
Spring Boot+微信小程序_保存微信登录者的个人信息
小程序的登录与静默续期
每一个有数据交互的小程序,都会涉及到登录、token 等问题,openid 又是什么呢?怎么使用静默续期,来提升用户体验呢?
ITer.996
2019/08/28
2.9K0
小程序的登录与静默续期
相关推荐
微信小程序中用户登录和登录态维护
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档