最近闲下来在做一些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

一个简单的大转盘抽奖程序(附.NetCore Demo源码)的更多相关文章

  1. Android Gallery实现3D相册(附效果图+Demo源码)

    今天因为要做一个设置开机画面的功能,主要是让用户可以设置自己的开机画面,应用层需要做让用户选择开机画面图片的功能.所以需要做一个简单的图片浏览选择程序.最后选用Gallery作为基本控件.加入了一些炫 ...

  2. 近期热门微信小程序demo源码下载汇总

    近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...

  3. 纯CSS3大转盘抽奖(响应式、可配置)

    源于前段时候微信小程序最初火爆公测时段,把以前用 Canvas 实现的大转盘抽奖移植成微信小程序,无奈当时小程序对 Canvas 支持不够完善,只好降低用 CSS3 实现.虽然比不上 Canvas 绘 ...

  4. Java 实现大转盘抽奖

    需要用到 JAVA中的Random()函数 注意:大转盘抽奖各奖项中奖概率之和为 1.奖品列表中的概率为累加概率,需要按照添加进列表的顺序进行累加,添加顺序不做要求. 实际中使用需要考虑奖品数量限制等 ...

  5. jquery——九宫格大转盘抽奖

    一.用到的图片 二.代码如下,重点是js部分 <!DOCTYPE html> <html> <head> <meta http-equiv="Con ...

  6. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断

    C#保留2位小数几种场景总结   场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...

  7. 【Vue.js游戏机实战】- Vue.js实现大转盘抽奖总结

    大家好!先上图看看本次案例的整体效果. 实现思路: Vue component实现大转盘组件,可以嵌套到任意要使用的页面. css3 transform控制大转盘抽奖过程的动画效果. 抽奖组件内使用钩 ...

  8. 在 Visual Studio 中创建一个简单的 C# 控制台应用程序

    转载:https://blog.csdn.net/qq_43994242/article/details/87260824 快速入门:使用 Visual Studio 创建第一个 C# 控制台应用 h ...

  9. 一个简单的c# 贪吃蛇程序

    一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...

  10. Django 学习笔记之六 建立一个简单的博客应用程序

    最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...

随机推荐

  1. Python打包工具之pyinstaller

    前言: 近期使用PySimpleGUI开发了一款开发者工具X-助手工具,意打造成平常开发助手,无论是图片还是网址的处理等等都需要这一个工具即可,无需在网上找各个网站去找解决方案, 对于GUI的打包工具 ...

  2. 抓包工具之MitmProxy

    官方文档: https://mitmproxy.org/ github:https://github.com/mitmproxy/mitmproxy 缘起: 之前使用过几个抓包工具, 例如fiddle ...

  3. python多版本管理软件pyenv

    我们在平时的项目开发或者学习中,有可能使用不同的Python版本,大家都知道Python的版本非常多,如果我们把需要的不同版本的Python都下载到服务器上,管理起来会非常困难,多版本并存又容易互相干 ...

  4. Nuxt.js 应用中的 webpack:progress 事件钩子

    title: Nuxt.js 应用中的 webpack:progress 事件钩子 date: 2024/11/27 updated: 2024/11/27 author: cmdragon exce ...

  5. C++中的多线程及其之后的周边

    多线程 参考:https://zhuanlan.zhihu.com/p/613630658 平台差异:Linux 与 Windows,跨平台方案 在Linux上,有pthread的使用,而C++ 11 ...

  6. cockpit-325以及新版本安装和cockpit-files安装

    查看版本cockpit可安装版本,发现最新的只有310版本 sudo yum list cockpit --showduplicates Last metadata expiration check: ...

  7. Docker目录汇总

    Docker目录汇总 Docker资料分享 Docker 教程 | 菜鸟教程 Docker入门级简易手册 Docker - 从入门到实践 Kubernetes中文手册 Kubernetes 指南 我的 ...

  8. 我用cursor, 半就开发了一个手机壁纸小程序,真的太强了

    前言 我用chatGPT帮我写后端爬虫,分析知乎html代码,爬取知乎壁纸.然后用cursor AI工具,完全使我一个不懂前端uniapp框架的人,开发了一个小程序手机壁纸页面. 原来一周的工作量,半 ...

  9. Spring完全注解开发

    注解的好处:如果管理很多的Bean,要求这些Bean都配置在applocationContext.xml文件中.用了注解之后,就不需要在xml文件中配置了,Spring提供了几个辅助类会自动扫描和装配 ...

  10. 【前端】【H5 API】实现文件读取操作

    H5 API 实现文件读取操作 该接口通过FileReader对象来读取本地存储的文件,然后使用File对象来指定读取的文件或数据 File对象 可以是来自用户在一个元素上(如<input> ...