思路分析
一个完整的抽奖过程,首先应该由如何获取抽奖机会开始,获得抽奖机会后,即可参与抽奖。抽奖最常见的一种是限定每个用户只能中奖一次(不可重复中奖),另一种是不限制(可重复中奖)。至于抽奖主办方则更关注的是有关奖品的配置,如何能尽可能的保证奖品公平的发送到所有参与用户的手里。这里就涉及到中奖概率该如何实现,以及如果避免用户恶意刷奖,从而导致活动失去意义。
本文主要目标是实现一个通用的抽奖模块,任何抽奖模式只是业务模式形式不一样而已,到抽奖环节都一样,所以分装好的抽奖模块几乎适用于所有常见抽奖环境。
搭建项目
- 环境准备
开发工具:VS2022
项目框架:.NET 6.0
Redis Version: 7.2.4
MySql:5.7.30 - 创建MVC项目
添加控制器,代码如下:
public class DemoController : Controller
{
private readonly ConnectionMultiplexer redis;
private readonly IDatabase db;
private readonly DemoContext demoContext;
private readonly int JoinCount = 100;
public DemoController(DemoContext _demoContext)
{
redis = ConnectionMultiplexer.Connect("127.0.0.1:6379,password=1234567890");
db = redis.GetDatabase();
demoContext = _demoContext;
}
/// <summary>
/// 列表页视图
/// </summary>
/// <returns></returns>
public async Task<IActionResult> Index()
{
var dtos = await demoContext.Prize.OrderBy(h => h.Type).ThenBy(h => h.Id).ToListAsync();
return View(dtos);
}
/// <summary>
/// 添加奖品视图
/// </summary>
/// <returns></returns>
public IActionResult Add()
{
return View();
}
/// <summary>
/// 修改奖品库存视图
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<IActionResult> UpdateStock(int id)
{