一个简单的大转盘抽奖程序(附.NetCore Demo源码)
最近闲下来在做一些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); }
预览地址:http://lucky.idevtool.com/
开源demo地址:https://gitee.com/jomingol/lucky
程序员工具站点:草根工具www.idevtool.com
码农都是有尊严的
转载请注明来源,谢谢
http://www.cnblogs.com/benpao/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~