最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql
1.前端实现:
前端用的是基于开源的lottery,其中有些改动的,使得前端可以自适应pc端和手机端浏览器,以下是前端js调用实现:
var accountId = 1; var lottery = new LotteryDial(document.getElementById('luckPointer'), { // eslint-disable-line speed: 30, // 每帧速度 areaNumber: 8, // 奖区数量 circleNumber: 5 //旋转圈数 }); var index = -1; var luckProduct = {}; lottery.on('start', function() { // 请求获取中奖结果 $.ajax({ url: '@Url.Action("GetLuckyResult")', dataType: 'json', type: 'post', async :false, data: { accountId: accountId, ran: Math.random() } }).done(function(d) { if (d.code === 0) { console.log('剩余次数为0'); } if (d.code === 1) { console.log(d.data); index = parseInt(d.data.luckyIndex); luckProduct = d.data; lottery.setResult(index); } }); // 假如请求出错 // setTimeout(function () { // lottery.reset() // }, 1000) }); lottery.on('end', function() { console.log('中奖奖区:' + index); if (luckProduct != null && luckProduct.isLucky) { layer.msg('恭喜您中奖了,你将获得了:' + luckProduct.productName); } else { layer.msg('谢谢参与!'); } });
2.后端逻辑实现
后端用的简单算法,步骤如下
a.根据奖品概率构造一个区间
b.通过随机数Rondom的API获取随机值 [0, 最大值)
c.根据随机值匹配到对应区间的奖品,即是抽取到的奖品
代码实现如下:
public async Task<LuckyProduct> GetLuckyAction(int accountId) { var res = new LuckyProduct(); try { var allow = Db.Queryable<LuckyAccount>().Where(e => e.AccountId == accountId).First(); if (allow == null || allow.AllowCount <= 0) return await Task.Run(() => res); bool isSaveAction = LuckyActionDb.Insert(new LuckyAction() { AccountId = accountId, LuckyAccount = "test", CreatedAt = DateTime.Now }); if (isSaveAction) { allow.AllowCount = allow.AllowCount - 1; bool isUpdateAllow = LuckyAccountDb.Update(allow); if (isUpdateAllow) { var list = LuckyProductDb.GetList(e => e.ProductStatus == 1 && e.ProductStore > 0); if (list != null && list.Count > 0) { res = list.Find(e => e.IsLucky == 0); Random r = new Random(); int index = r.Next(1, 100); foreach (LuckyProduct t in list) { if (t.ProductLuckyRateMin <= index && t.ProductLuckyRateMax >= index) { res = t; } } if (res != null && res.IsLucky == 1) { res.ProductStore = res.ProductStore - 1; LuckyProductDb.Update(res); LuckyResultDb.Insert(new LuckyResult() { AccountId = accountId, CreatedAt = DateTime.Now, LuckyAccount = "test", ProductCode = res.ProductCode, ProductId = res.ProductId, ProductName = res.ProductName }); } } } } } catch (Exception ex) { } return await Task.Run(() => res); }
开源demo地址:https://gitee.com/jomingol/lucky
程序员工具站点:程序员工具箱www.idevtool.com