1、创建大转盘对象:
//添加大转盘对象并添加大转盘奖项对象(一等奖,二等奖,三等奖等等) public ActionResult WheelCreate(WheelViewModel form) { var UserId = WebSecurity.GetUserId(User.Identity.Name); var user = UserProfileRepository.Find(Specification<EasyWeixin.Model.UserProfile>.Eval(o => o.UserId == UserId)); form.ResponseImageTextViewModel.ImageTextName = form.WheelTitle; form.ResponseImageTextViewModel.ImageTextType = 101; form.ResponseImageTextViewModel.UserId = WebSecurity.GetUserId(User.Identity.Name); form.ResponseImageTextViewModel.AddTime = DateTime.Now; form.UserId = WebSecurity.GetUserId(User.Identity.Name); form.AddDate = DateTime.Now; if (ModelState.IsValid) { Wheel Wheel = Mapper.Map<WheelViewModel, Wheel>(form); Wheel.WheelStyle = "Wheel.css"; Wheel.ResponseImageText = Mapper.Map<ResponseImageTextViewModel, ResponseImageText>(form.ResponseImageTextViewModel); WheelRepository.Add(Wheel); WheelRepository.Context.Commit(); Wheel.ResponseImageText.Url = "http://xxx/ActivityWheel/WheelIndex?WheelID=" + Wheel.ID + "&ImageTextID=" + Wheel.ResponseImageText.ID; Wheel.GetURL = "http://xxx/ActivityWheel/WheelIndex?WheelID=" + Wheel.ID + "&ImageTextID=" + Wheel.ResponseImageText.ID + "&User_ID=" + user.ID; for (int i = 0; i < 3; i++) { var Angle = GetAngle(i, 3, 5); WheelItem wi = new WheelItem(); wi.WheelItemScale = i + 1; wi.WheelItemName = GetChineseNum(i + 1) + "等奖"; wi.WheelItemAward = ""; wi.isOrder = i; wi.MaxAngle = Angle.Split(\'|\')[1]; wi.MinAngle = Angle.Split(\'|\')[0]; wi.WheelID = Wheel.WheelID; wi.AddDate = DateTime.Now; WheelItemRepository.Add(wi); WheelItemRepository.Context.Commit(); } WheelRepository.Update(Wheel); WheelRepository.Context.Commit(); } return Redirect("/Wheel/WheelIndex"); } /// <summary> /// /// </summary> /// <param name="i">角度索引</param> /// <param name="num">角度平均分块</param> /// <param name="f">角度波动</param> /// <returns></returns> public string GetAngle(int i, int num, int f) { //获取平均角度区域 var average = 360 / num; var averagehalf = 360 / (num * 2); var half = i * average; var str = (half - f).ToString() + "|" + (half + f).ToString(); return str; } public string GetChineseNum(int i) { var str = "零"; if (i == 1) { str = "一"; } if (i == 2) { str = "二"; } if (i == 3) { str = "三"; } if (i == 4) { str = "四"; } if (i == 5) { str = "五"; } if (i == 6) { str = "六"; } if (i == 7) { str = "七"; } if (i == 8) { str = "八"; } return str; }
2、大转盘运行:
界面:
@{ ViewBag.Title = "WheelIndex"; Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" /> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta content="telephone=no" name="format-detection" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <link href="/Content/Wheel/global.css" rel="stylesheet" type=\'text/css\' /> <link href="/Content/Wheel/turntable.css" rel="stylesheet" type=\'text/css\' /> <script type=\'text/javascript\' src="/Scripts/jquery-1.7.2.min.js"></script> <script type=\'text/javascript\' src="/Scripts/easing.min.js"></script> <script type=\'text/javascript\' src="/Scripts/rotate.2.2.js"></script> <script type=\'text/javascript\'> var turntable_obj = { turntable_init: function () { $(\'#startbtn\').rotate({ bind: { click: function () { var WheelID = $("#WheelID").val(); var UserWexinID = $("#UserWexinID").val(); $.post("/ActivityWheel/GetWheelitem", { WheelID: WheelID, UserWexinID: UserWexinID }, function (data) { if (data.message == undefined) { var Max = data.MaxAngle; var Min = data.MinAngle; var range = GetRandomNum(Min, Max); $(\'#startbtn\').rotate({ duration: 6000, angle: range, animateTo: 5400 + range, easing: $.easing.easeOutSine, callback: function () { if (data.WheelItemID > 0) { win_alert(data.WheelItemName + \'SN码为:\' + data.WheelCode, function () { $(\'#WinPrize\').slideDown(500); $(\'#PrizeClass\').html(data.WheelItemName); $(\'#SnNumber\').html(data.WheelCode); $(\'#GetPrize input[name=MobilePhone]\').focus(); }); } else { win_alert("谢谢参与,请继续努力", function() { }); } } }); } else { win_alert(data.message); return false; } }, \'json\'); } } }); var Phone = $(\'input[name=MobilePhone]\'); $(\'#GetPrize\').submit(function () { return false; }); $(\'#GetPrize input:submit\').click(function () { if (Phone.val() == \'\') { win_alert(\'请填写手机号码!\', function () { Phone.focus() }); return false; } if (!(/^13\d{9}$/g.test(Phone.val()) || /^14[57]\d{8}$/g.test(Phone.val()) || /^15[0-35-9]\d{8}$/g.test(Phone.val()) || /^18\d{9}$/g.test(Phone.val()))) { win_alert("\'" + Phone.val() + "\'不是一个有效的手机号码!", function () { Phone.focus() }); return false; } $(this).attr(\'disabled\', true).val(\'提交中...\'); $.post(\'/ActivityWheel/WheelAdd\', { WheelUserPhone: Phone.val() }, function (data) { win_alert(data.message, function () { location.href = location.href; }); $(\'#GetPrize input:submit\').attr(\'disabled\', false).val(\'提交\'); }, \'json\'); }); } } function GetRandomNum(Min, Max) { var Range = Max - Min; var Rand = Math.random(); var r = parseInt(Min) + parseInt(Math.round(Rand * Range)); return r; } function win_alert(tips, handle) { $(\'body\').prepend(\'<div id="global_win_alert"><div>\' + tips + \'</div><h1>确定</h1></div>\'); $(\'#global_win_alert\').css({ position: \'fixed\', left: $(window).width() / 2 - 125, top: \'30%\', background: \'#fff\', border: \'1px solid #ccc\', opacity: 0.95, width: 250, \'z-index\': 10000, \'border-radius\': \'8px\' }).children(\'div\').css({ \'text-align\': \'center\', padding: \'30px 10px\', \'font-size\': 16 }).siblings(\'h1\').css({ height: 40, \'line-height\': \'40px\', \'text-align\': \'center\', \'border-top\': \'1px solid #ddd\', \'font-weight\': \'bold\', \'font-size\': 20 }); $(\'#global_win_alert h1\').click(function () { //if (tips != "已经提交过相同的手机号,请重新填写!") { $(\'#global_win_alert\').remove(); // } }); if ($.isFunction(handle)) { if (tips != "您提交的手机号码已经中过奖了!") { $(\'#global_win_alert h1\').click(handle); } } } </script> <script language="javascript">$(document).ready(turntable_obj.turntable_init);</script> </head> @model EasyWeixin.Model.Wheel <body> <input id="WheelID" type="hidden" value="@Request["WheelID"]" /> <input id="UserWexinID" type="hidden" value="@Request["UserWexinID"]" /> <div id="turntable"> <div id="WheelEvent"> <div class="demo"> <div id="disk"></div> <div id="start"> <img id="startbtn" src="/images/Activity/Wheel/wheel_arrow[1].png"> </div> </div> <div id="WinPrize" class="refer none"> <span>恭喜您抽中 <font id="PrizeClass"></font>(SN码:<font id="SnNumber"></font>),请输入您的手机号并记录SN码,作为领奖凭证!<font style="color:red;">逾期无效!!</font></span> <div> <form id="GetPrize"> <div class="input"> <input type="input" name="MobilePhone" value="" class="form_input" pattern="[0-9]*" maxlength="11" /> </div> <div class="input"> <input type="submit" value="提交" class="submit" /> </div> </form> </div> </div> <div id="turntable_success">提交成功!</div> <div class="refer"> <span>兑换说明(<font color="#FF0000">亲,中奖后请务必输入您的手机号并记录SN码,否则无法领奖喔!</font>)</span> <div> @if (Model.WheelItems != null) { foreach (var item in Model.WheelItems) { //var html = item.WheelItemName + ":" + item.WheelItemAward + "。奖品数量:" + item.WheelItemScale + ""; var html = item.WheelItemName + ":" + item.WheelItemAward; @html;<br /> } } </div> </div> <div class="refer"> <span>活动说明</span> <div>@Html.Raw(Model.WheelDesc)</div> </div> </div> </div> </body> </html>
后台:
#region 大转盘 /// <summary> /// 大转盘首页 /// </summary> /// <param name="WheelID"></param> /// <param name="ImageTextID"></param> /// <param name="User_ID"></param> /// <param name="UserWexinID"></param> /// <returns></returns> public ActionResult WheelIndex(Guid WheelID, Guid ImageTextID, Guid User_ID, string UserWexinID = "") { var user = UserProfileRepository.GetByKey(User_ID); Session["UserId"] = user.UserId; var Wheel = WheelRepository.GetByKey(WheelID); return View(Wheel); } /// <summary> /// 获取数据 /// </summary> /// <returns></returns> public JsonResult GetWheelitem(Guid WheelID, string UserWexinID = "") { var ip = Request.UserHostAddress; var dt = DateTime.Now.Date; var Wheel = WheelRepository.GetByKey(WheelID); GetWheelCode(WheelID); //声明日志, WheelLog WheelCode; var logs = WheelLogRepository.FindAll(Specification<WheelLog>.Eval(o => o.WheelID == Wheel.WheelID && o.IsAward > 0)).ToList(); int num = 0; foreach (var item in Wheel.WheelItems) { num += item.WheelItemScale; } if (logs.Count >= num) { WheelCode = new WheelLog(); WheelCode.WheelCode = "0"; WheelCode.IsAward = 0; WheelCode.AddDate = DateTime.Now; WheelCode.WheelID = Wheel.WheelID; } else { WheelCode = GetWheelCode(WheelID); } //var WheelCode = GetWheelCode(WheelID); WheelCode.IP = ip; Session["WheelCode"] = WheelCode; int IsAward = WheelCode.IsAward; WheelItemViewModel Wheelitem = new WheelItemViewModel(); if (IsAward > 0) { var Si = Wheel.WheelItems.ToList()[IsAward - 1]; Wheelitem = Mapper.Map<WheelItem, WheelItemViewModel>(Si); Wheelitem.WheelCode = WheelCode.WheelCode; } else { //由于大转盘有十二个位置点,按照索引从0开始到11,其中,0,4,8为中将点,所以设置一个没有0,4,8的不中间数组,而后进行随机处理 int[] arr = { 1, 2, 3, 5, 6, 7, 9, 10, 11 }; Random randow = new Random(); int ran = randow.Next(0, arr.Length - 1); string Angle = GetAngle(arr[ran], 12, 5); Wheelitem.WheelCode = WheelCode.WheelCode; Wheelitem.WheelItemID = IsAward; Wheelitem.MaxAngle = Angle.Split(\'|\')[1]; Wheelitem.MinAngle = Angle.Split(\'|\')[0]; Wheelitem.WheelItemName = "谢谢惠顾"; } var log = WheelLogRepository.FindAll(Specification<WheelLog>.Eval(o => o.IP == ip && o.AddDate > dt && o.WheelID == Wheel.WheelID)).ToList(); if (log.Count < Wheel.EveryDayTimes && Wheel.StartDate < DateTime.Now && Wheel.EndDate.AddDays(1) > DateTime.Now) { ///添加日志,记录抽奖结果,不管中奖还是没中都记录 WheelLogRepository.Add(WheelCode); WheelLogRepository.Context.Commit(); return Json(Wheelitem); } else if (DateTime.Now < Wheel.StartDate || DateTime.Now > Wheel.EndDate.AddDays(1)) { return Json(new { message = "活动已经结束了!" }, JsonRequestBehavior.AllowGet); } else { return Json(new { message = "每日只能提交" + Wheel.EveryDayTimes.ToString() + "次" }, JsonRequestBehavior.AllowGet); } } /// <summary> /// 获取一个角度的最大值和最小值字符串 /// </summary> /// <param name="i">角度索引</param> /// <param name="num">角度平均分块</param> /// <param name="f">角度波动</param> /// <returns></returns> public string GetAngle(int i, int num, int f) { //获取平均角度区域 var average = 360 / num; var averagehalf = 360 / (num * 2); var half = i * average; var str = (half - f).ToString() + "|" + (half + f).ToString(); return str; } /// <summary> /// 用户提交数据 /// </summary> /// <param name="WheelUser">大转盘玩家实体,实体中只传递过来玩家的手机号码</param> /// <returns></returns> public JsonResult WheelAdd(WheelUser WheelUser) { if (Session["WheelCode"] != null) { var WheelCode = (WheelLog)Session["WheelCode"]; var Wheel = WheelRepository.Find(Specification<Wheel>.Eval(o => o.WheelID == WheelCode.WheelID)); //循环判断是否已存在相同的手机号码 var users = WheelUserRepository.FindAll(Specification<WheelUser>.Eval(o => o.WheelID == Wheel.WheelID)).ToList(); foreach (var item in users) { if (item.WheelUserPhone.Equals(WheelUser.WheelUserPhone)) { return Json(new { message = "您提交的手机号码已经中过奖了!" }); } } var ip = Request.UserHostAddress; var dt = DateTime.Now.Date; WheelUser.WheelItemID = Wheel.WheelItems.ToList()[WheelCode.IsAward - 1].WheelItemID; WheelUser.WheelID = WheelCode.WheelID; WheelUser.IP = Request.UserHostAddress; WheelUser.WheelCode = WheelCode.WheelCode; WheelUser.UserId = int.Parse(Session["UserId"].ToString()); WheelUser.AddDate = DateTime.Now; WheelUser.WheelLogID = WheelCode.WheelLogID; WheelUserRepository.Add(WheelUser); WheelUserRepository.Context.Commit(); Session["WheelCode"] = null; return Json(new { message = "提交成功" }); } else { return Json(new { message = "已超时!" }); } } /// <summary> /// 获取一个随机日志实体 /// </summary> /// <param name="WheelID"></param> /// <returns></returns> public WheelLog GetWheelCode(Guid WheelID) { //DateTime dt = DateTime.Now.AddHours(-1); DateTime dt= DateTime.Now.AddMinutes(-10); var Wheel = WheelRepository.GetByKey(WheelID); var users = WheelUserRepository.FindAll(Specification<WheelUser>.Eval(o => o.WheelID == Wheel.WheelID)).ToList(); //清理日志 如果用户中奖 10分钟里没有提交信息 就将日志其删除 var logs = WheelLogRepository.FindAll(Specification<WheelLog>.Eval(o => o.WheelID == Wheel.WheelID && o.IsAward > 0 && o.AddDate < dt)).ToList(); foreach (var item in logs) { if (!users.Exists(o => o.WheelLogID == item.WheelLogID)) { WheelLogRepository.Remove(item); WheelLogRepository.Context.Commit(); } } var userWheelCodes = users.Select(o => o.WheelCode).ToList(); //获取奖品的概率容量 int container = Wheel.WheelScale; var WheelItems = Wheel.WheelItems.ToList(); for (int i = 0; i < WheelItems.Count; i++) { container = container - WheelItems[i].WheelItemScale; } //设定一个string动态数组 添加中奖代号 List<WheelLog> WheelCodes = new List<WheelLog>(); for (int i = 0; i < WheelItems.Count; i++) { //剩余奖品数量 var k = i + 1; var itemlogs = WheelLogRepository.FindAll(Specification<WheelLog>.Eval(o => o.WheelID == Wheel.WheelID && o.IsAward == k)).ToList(); var sum = WheelItems[i].WheelItemScale - itemlogs.Count; for (int j = 0; j < sum; j++) { WheelLog log = new WheelLog(); log.WheelCode = Function.GuidTo16String(Guid.NewGuid()); log.IsAward = k; log.AddDate = DateTime.Now; log.WheelID = Wheel.WheelID; WheelCodes.Add(log); } } //不中奖的概率容量,从而添加不中奖的日志信息 if (container > 0) { for (int i = 0; i < container; i++) { WheelLog log = new WheelLog(); log.WheelCode = "0"; log.IsAward = 0; log.AddDate = DateTime.Now; log.WheelID = Wheel.WheelID; WheelCodes.Add(log); } } //获取一个随机数 随机抽奖 Random randow = new Random(); int ran = randow.Next(0, WheelCodes.Count - 1); return WheelCodes[ran]; } #endregion