微信抽奖小程序怎么弄(免费制作小程序抽奖活动的方法)
-
-
类目:知识大全
-
联系人:
-
微信号:
-
Q Q 号:
-
手机号:
-
浏览量:
290
【商户信息】
【货源详情】
我以前学习过区块链。 然后,我看到很多区块链项目都是基于golang开发的。 也包括以太坊的官方go-ethereum。 知道go是谷歌制造的,很多人都说有c/c的性能,脚本语言的开发效率很高。 我被吸引了,开始学习。 在后台遇到性能瓶颈的场景,以及区块链的开发之后会变得容易。
最近小程序大受欢迎,这个技术堆栈也要学习理解。 我想做一个简单的抽奖小程序。 后台可以通过go实现,学习小程序开发,一箭双雕。 实践总是学习的最好方法。
如果你是P.S.Golang初学者,请下载下图资料。 点击个人资料图片,关注后,通过私信回复“资料”即可获得。
一、后台整体架构
后台体系结构
整体背景的结构设计如上图所示。
在小程序和后台之间使用https通信并确保安全性也是为了满足小程序的官方硬规则。 腾讯的负载均衡作为后台门户有几个优点。 处理和解密https流量后,通过http将请求传输到后端服务器,简化了逻辑,减少了https对后台服务的性能影响,同时实现了动态扩展
负载平衡通过http将请求转发给cvm进行处理。 nginx制作了反向代理,go服务端在本地跑。
使用腾讯云的redis和mysql数据库。 redis用于频繁的用户认证等,mysql保存普通数据。
这样的设计在抽签这样的情况下,可以确保充分的同时性和流量。 如果希望提高并发性,可以配置负载平衡并动态扩展,以提高云数据库的处理能力。 如果有时间,请写下如何进行性能评估,并相应地进行提高并发性的升级。
二、抽奖流程设计
因为每天工作都很忙,没有那么多时间。 我打算先拿到最简单的抽签逻辑,等有时间和精力再重复。 用户可以进入小程序创建抽奖活动,设置活动主题、开奖时间、奖品、数量。 然后可以共享,其他用户点击参加抽签。 到了抽签时间,将进行随机抽签,参加抽签的每个用户最多只能当选一次。 获奖后,向所有抽签用户发送信息。
实际上,利用开奖可以很容易地进行大致的划分:
开奖前:用户创建抽奖活动后,所有用户均可参与抽奖或取消抽奖。 创建者可以删除抽签事件。
推荐中:到了推荐时间时,此抽奖事件将被锁定,不再允许用户进行操作。 然后在内部进行抽奖,将奖品随机分为抽奖用户。
推荐后:奖品分配完成并公布结果。 必须向所有用户显示抽签结果,并通知参加抽签的用户。
几个重要的接口
三、api文档设计
界面文档非常重要,值得用心好好写。 我认为这是做后台开发的基本素养。 不管项目小还是大,都需要好的文档。 文档做好后,有很多好处。 随着时间和迭代,我们仍然可以对各个接口有很好的理解。 界面文档可以分离后台开发和外部依赖,可以解除前端和后台的结合。 同时,编写界面文档的过程实际上是一个思考和整理的过程,通过细致的讨论和思考,分清细节,避免漏洞。
以下是我维护的文档,首先是基本说明、域名、基本路径等。
下面是每个接口的详细说明。 定义请求和返回的结构以及每个参数的含义和格式。
一个接口的信息
我一般在git上维护最新的md格式的接口文档。 有了合作,别人就会对界面产生疑问,所以在交流中不用每次都剥皮,就可以按照文档的说明调用。
四、实现
4.1 web框架选择
查一下go的web框架,现在使用的beego、echo、gin很多,选择喜欢的就可以了。 我选择了echo。 感觉文档有点齐全。 但相对于其他语言的web框架,echo文档太少且不完整,学习和使用成本高。
用echo,我先把官方文件总体通过了一次,但是最完整的资料是官方文件的介绍,所以要经常坚持学习英语。 附件URL:https://echo.lab stack.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/
连接数据库
import ' database/SQL ' import _ ' github.com/go-SQL-driver/MySQL ' db,err=SQL.open(MySQL ),' user 33333333333333
取得数据
Query ) )来绑定参数并进行查询。 这里比较麻烦的是获取db中一行的数据,需要用Scan ()逐个赋值。 取出的数据很多的时候有点麻烦,但是我喜欢自己操作sql语句。 有些orm框架很容易使用,但缺乏编程思维和编写sql的训练。 自己写sql的话,会考虑如何优化。 我经常问自己几个问题。 可以减少一次sql查询吗? 查询的sql语句会更有效率吗? 设计的sql表更好吗?
var (
id int
名称字符串
) rows,err:=db.query('selectid,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 (updateeventssetstatus=?) ,cancel_time=? where id=? 和状态=? '、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 ),err :=tx.prepare (insertintofoovalues )? () ) 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
每个请求都需要认证会话。 在这里使用redis。 用于redis操作的名为github.com/garyburd/re digo/redis的库。
大家的流程是一样的。 连接redis,进行put、get操作。 这里有一个简单的软件包示例,请作为参考。 3359 github.com/ais CRM/redis go/blob/master/redis.go
4.3 微信登录流程
下面介绍微信用户如何使用小程序登录的流程。
a .用户进入小程序。 小程序使用wx.login ()在微信后台登录,登录成功后获得代码。 真正的回归是这样的:
{errMsg: 'login:ok ',code : ' 001 nn sq v1 QS TGA0x1bsv 13 u7r v1 nns QA }
b .小程序把这个代码发送到了我们自己的后台。
c .后台收到该代码后,拼接url前往微信后台获取该微信用户的session_key。
3359 API.weixin.QQ.com/SNS/jscode2session? appid=appidsecret=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-13t 18336019336041.47275845108336000 ',' level':'DEBUG ', ' prefix ' : ' echo ' message ' : ' result : map [ session _ key : I g6 tsroilo2cpxcnk0txvg==expires _ in 3360720
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上快速部署? 如何构建自动化编译、部署和测试的完整流程? 这些之后有时间,但之后会集中起来继续发送。